У меня есть этот список файлов на сервере 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
Есть ли другой способ удалить выбранные файлы сразу?
GNU
нужен?Ответы:
Bash поддерживает всевозможные подстановочные знаки и расширения.
Ваш точный случай будет обработан расширением фигурных скобок , например:
Вышеупомянутое будет расширено до одной команды со всеми тремя аргументами и будет эквивалентно вводу:
Важно отметить, что это расширение выполняется оболочкой еще до
rm
загрузки.источник
Используйте подстановочный знак (
*
) для сопоставления нескольких файлов.Например, приведенная ниже команда удалит все файлы с именами, начинающимися с
abc.log.2012-03-
.Я бы рекомендовал запустить
ls abc.log.2012-03-*
список файлов, чтобы вы могли видеть, что вы собираетесь удалить, перед запускомrm
команды.Для получения дополнительной информации см. Справочную страницу Bash о расширении имени файла .
источник
Если вы хотите удалить все файлы, имена которых соответствуют определенной форме, подстановочный знак (шаблон glob) является наиболее простым решением. Некоторые примеры:
Регулярные выражения более эффективны, чем подстановочные знаки; вы можете скормить вывод
grep
вrm -f
. Например, если некоторые имена файлов начинаются с,"abc.log"
а некоторые с"ABC.log"
,grep
вы можете выполнить сопоставление без учета регистра:Это вызовет проблемы, если какое-либо из имен файлов будет содержать забавные символы, включая пробелы. Быть осторожен.
Когда я это делаю, я
ls | grep ...
сначала запускаю команду и проверяю, дает ли она желаемый результат, особенно если я используюrm -f
:где
!!
заменяется на предыдущую команду. Или я могу ввести стрелку вверх или Ctrl-P и отредактировать предыдущую строку, чтобы добавитьrm -f
команду.Предполагается, что вы используете оболочку bash. Некоторые другие оболочки, особенно csh и tcsh, а также некоторые более старые оболочки, производные от sh, могут не поддерживать
$(...)
синтаксис. Вы можете использовать эквивалентный синтаксис обратной кавычки:$(...)
Синтаксис легче читать, и если вы действительно амбициозны это может быть вложенным.Наконец, если подмножество файлов, которые вы хотите удалить, не может быть легко выражено с помощью регулярного выражения, я часто использую трюк, чтобы перечислить файлы во временный текстовый файл, а затем отредактировать его:
Затем я могу отредактировать
list
файл вручную, оставив только те файлы, которые хочу удалить, а затем:или
(Опять же, это предполагает, что ни одно из имен файлов не содержит забавных символов, особенно пробелов.)
Или при редактировании
list
файла я могу добавитьrm -f
в начало каждой строки, а затем:или
Редактирование файла также дает возможность при необходимости добавлять кавычки, например, переход
rm -f foo bar
наrm -f 'foo bar'
.источник
Просто используйте многострочный выбор в sublime, чтобы объединить все файлы в одну строку и добавить пробел между каждым именем файла, а затем добавить
rm
в начало списка. Это в основном полезно, когда в именах файлов, которые вы хотите удалить, нет шаблона.источник
Для этого хорошо подойдет подстановочный знак, хотя в целях безопасности было бы лучше использовать подстановочный знак как можно меньше, поэтому что-то вроде этого:
Хотя, судя по всему, это всего лишь отдельные файлы? В рекурсивной опции нет необходимости, если ни один из этих элементов не является каталогом, поэтому лучше не использовать ее в целях безопасности.
источник
Я не гуру Linux, но я считаю, что вы хотите передать свой список выходных файлов по конвейеру
xargs rm -rf
. Я использовал что-то подобное в прошлом с хорошими результатами. Сначала проверьте образец каталога!ИЗМЕНИТЬ - Возможно, я неправильно понял, основываясь на других появляющихся ответах. Если вы можете использовать подстановочные знаки, отлично. Я предположил, что ваш исходный список, который вы отображали, был сгенерирован программой, чтобы предоставить вам ваш «выбор», поэтому я подумал, что
xargs
лучше всего будет использовать конвейер .источник
если вы хотите удалить сразу все файлы, принадлежащие каталогу. Например: имя вашего каталога - "log", а каталог "log" включает файлы abc.log.2012-03-14, abc.log.2012-03-15, ... и т.д. Вы должны быть выше каталога журналов и:
источник