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



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



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


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

732   7  

7 ответов:

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 еще загружен.

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

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

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

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

для получения более подробной информации см. страницу bash man на расширение имени файла.

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

$ 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\.')

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

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

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

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

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

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

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

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

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

$ rm -f $(<list)

или

$ rm -f `cat list`

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

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

$ . ./list

или

$ source ./list

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

rm -rf abc.log.2012-*

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

просто используйте многострочный выбор в sublime, чтобы объединить все файлы в одну строку и добавить пробел между каждым именем файла, а затем добавить 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

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

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

Если вы хотите удалить все файлы, которые относятся к каталог сразу. Например, Йор имя каталога "журнал" и справочник "журнала", в том числе ABC.бревно.2012-03-14, abc.бревно.2012-03-15,..... файлы ect. Вы должны быть выше каталога журнала и

rm-rf / log/*

Comments

    Ничего не найдено.