Подтвердить что ты не робот

Как удалить несколько файлов сразу в Bash в Linux?

У меня есть этот список файлов внутри сервера Linux:

abc.log.2012-03-14
abc.log.2012-03-27
abc.log.2012-03-28
abc.log.2012-03-29
abc.log.2012-03-30
abc.log.2012-04-02
abc.log.2012-04-04
abc.log.2012-04-05
abc.log.2012-04-09
abc.log.2012-04-10

Я удалял выбранные файлы журнала один за другим, используя команду rm -rf, как показано ниже:

rm -rf abc.log.2012-03-14 
rm -rf abc.log.2012-03-27
rm -rf abc.log.2012-03-28

Есть ли другой способ, чтобы я мог сразу удалить выбранные файлы?

4b9b3361

Ответ 1

Bash поддерживает всевозможные подстановочные знаки и расширения.

Ваш конкретный случай будет обрабатываться расширением брекета, например:

$ rm -rf abc.log.2012-03-{14,27,28}

Вышеописанное расширилось до единственной команды со всеми тремя аргументами и будет эквивалентно типу:

$ rm -rf abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28

Важно отметить, что это расширение выполняется оболочкой, еще до того, как rm загружен.

Ответ 2

Используйте подстановочный знак (*) для сопоставления нескольких файлов.

Например, приведенная ниже команда удалит все файлы с именами, начинающимися с abc.log.2012-03-.

rm -f abc.log.2012-03-*

Я бы рекомендовал запустить ls abc.log.2012-03-*, чтобы просмотреть файлы, чтобы вы могли видеть, что вы собираетесь удалить, прежде чем запускать команду rm.

Подробнее см. справочную страницу Bash в расширении имени файла.

Ответ 3

Если вы хотите удалить все файлы, имена которых соответствуют определенной форме, шаблон подстановки (шаблон glob) является самым простым решением. Некоторые примеры:

$ rm -f abc.log.*             # Remove them all
$ rm -f abc.log.2012*         # Remove all logs from 2012
$ rm -f abc.log.2012-0[123]*  # Remove all files from the first quarter of 2012

Регулярные выражения более мощные, чем подстановочные знаки; вы можете подать вывод grep на rm -f. Например, если некоторые имена файлов начинаются с "abc.log", а некоторые с "abc.log", grep позволяет вам нечувствительность к регистру:

$ rm -f $(ls | grep -i '^abc\.log\.')

Когда я это делаю, сначала запускаю команду ls | grep ... и проверяю, что она производит вывод, который я хочу, особенно если я использую rm -f:

$ ls | grep -i '^abc\.log\.'
(check that the list is correct)
$ rm -f $(!!)

где !! расширяется до предыдущей команды. Или я могу набрать стрелку вверх или Ctrl-P и отредактировать предыдущую строку, чтобы добавить команду rm -f.

Предполагается, что вы используете оболочку bash. Некоторые другие оболочки, в частности csh и tcsh и некоторые старые SH-производные оболочки, могут не поддерживать синтаксис $(...). Вы можете использовать эквивалентный синтаксис backtick:

$ rm -f `ls | grep -i '^abc\.log\.'`

Синтаксис $(...) легче читать, и если вы действительно амбициозны, он может быть вложен.

Наконец, если подмножество файлов, которые вы хотите удалить, не может быть легко выражено с помощью обычного выражения, трюк, который я часто использую, - это перечислить файлы во временный текстовый файл, а затем отредактировать его:

$ ls > list
$ vi list   # Use your favorite text editor

Затем я могу вручную отредактировать файл list, оставив только файлы, которые хочу удалить, а затем:

$ rm -f $(<list)

или

$ rm -f `cat list`

(Предполагается, что ни одно из имен файлов не содержит забавных символов, особенно пробелов.)

Или, редактируя файл list, я могу добавить rm -f в начало каждой строки, а затем:

$ . ./list

или

$ source ./list

Ответ 4

Дикая карта будет хорошо работать для этого, хотя, чтобы быть в безопасности, было бы лучше всего использовать дикую карту как можно меньше, поэтому что-то вроде этого:

rm -rf abc.log.2012-*

Хотя из-за внешнего вида это только отдельные файлы? Рекурсивный параметр не нужен, если ни один из этих элементов не является каталогом, поэтому лучше не использовать его, просто для безопасности.

Ответ 5

Просто используйте многострочный выбор в возвышенном, чтобы объединить все файлы в одну строку и добавить пробел между именами файлов, а затем добавить rm в начало списка. Это в основном полезно, если в именах файлов, которые вы хотите удалить, нет шаблона.

[$]> rm abc.log.2012-03-14 abc.log.2012-03-27 abc.log.2012-03-28 abc.log.2012-03-29 abc.log.2012-03-30 abc.log.2012-04-02 abc.log.2012-04-04 abc.log.2012-04-05 abc.log.2012-04-09 abc.log.2012-04-10

Ответ 6

Я не гуру linux, но я считаю, что вы хотите передать свой список выходных файлов на xargs rm -rf. Я использовал что-то подобное в прошлом с хорошими результатами. Сначала проверьте образец каталога.

EDIT - я мог бы неправильно понять, основываясь на других ответах, которые появляются. Если вы можете использовать подстановочные знаки, отлично. Я предположил, что ваш первоначальный список, который вы показывали, был сгенерирован программой, чтобы дать вам ваш "выбор", поэтому я думал, что путь к xargs будет способом.

Ответ 7

если вы хотите удалить все файлы, принадлежащие директории за один раз. Например; yor Имя каталога - это "журнал", а "журнал" - это abc.log.2012-03-14, abc.log.2012-03-15,..... ect files. Вы должны быть выше каталога журнала и

rm -rf/log/*