Как удалить несколько файлов сразу в 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
Есть ли другой способ, чтобы я мог сразу удалить выбранные файлы?
Ответы
Ответ 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/*