Linux, найти все файлы, соответствующие шаблону и удалить

Ищите все файлы (рекурсивно), которые имеют подчёркивание в имени своего файла, а затем удаляют их через командную строку.

4 Solutions collect form web for “Linux, найти все файлы, соответствующие шаблону и удалить”

Это самый безопасный и быстрый вариант:

find /path -type f -name '*_*' -delete 

Он не требует соединения и не разбивается, если файлы содержат пробелы или символы глобусов или что-то еще, что другие конструкторы задушили бы. Самое простое правило запомнить здесь – никогда не разбирать вывод вывода . И никогда не grep по именам файлов, если вы хотите что-то с ними сделать позже. Вы можете делать практически все, что можно find непосредственно.

См. Также: GNU find Manual – Удаление файлов

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

 find . -name '*_*' -exec rm -rf {} \; 

Если вам нужны только обычные файлы:

 find . -type f -name '*_*' -exec rm -f {} \; 

Хорошо, давайте сделаем это постепенно.

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

 find ${BASE_DIR}/ -name '*_*' -exec rm {} \; 

Но, конечно, это ужасно неэффективно. Он запускает весь процесс rm для каждого отдельного файла. Таким образом, хотя мы могли бы взять короткий объезд через \+ , это не то место, где мы собираемся закончить, так что давайте возьмем более короткий путь и приведем xargs чтобы дополнить имена файлов в группы:

 find ${BASE_DIR}/ -name '*_*' -print | xargs rm 

Но у этого есть две дыры в безопасности. Во-первых, если любое найденное имя файла начинается с знака минус, rm будет рассматривать его как параметр командной строки, а не имя файла, и генерировать ошибку. (У версии -exec rm {} также есть эта проблема.) Во-вторых, имена файлов, содержащие пробелы, не будут корректно обрабатываться xargs . Итак, дальнейшая итерация – сделать это немного более пуленепробиваемым:

 find ${BASE_DIR}/ -name '*_*' -print0 | xargs -0 rm -- 

И, конечно, есть интерактивные функции rm которые вы, вероятно, не хотите:

 find ${BASE_DIR}/ -name '*_*' -print0 | xargs -0 rm -f -- 

Параметры -print0 и -0 не являются стандартными, но find GNU и xargs , а также find FreeBSD и xargs понимают их. Однако даже это является более эффективным. Нам не нужно создавать какие-либо дополнительные процессы. find GNU и FreeBSD s может одновременно вызвать системный вызов unlink(2) :

 find ${BASE_DIR}/ -name '*_*' -delete 

Помните, что в качестве последней превентивной меры, чтобы остановить вас, делая больше, чем вы предполагали в определенных обстоятельствах, файловая система может содержать не только обычные файлы:

 find ${BASE_DIR}/ -name '*_*' -type f -delete 

find . -type f -regex ".*_.*" | xargs rm -f

объяснение
-type f находит только файлы
-regex ".*_.*" Выбирает только файлы с подчеркиванием в них
xargs rm -f затем принудительно удаляет выбранный файл (никогда не запрашивает перед удалением)

  • Какая версия моей дебианской системы?
  • Заменяя точку в строке, но оставляя последнюю
  • Где Skype сохраняет аватары моего контакта в Linux?
  • Какова цель файлов / etc / shadow и shadow cache в операционной системе Linux?
  • Как искать рекурсивно для строки в linux?
  • Что такое .Trash и .Trash-1000?
  • Как измерить среднее время выполнения скрипта?
  • Удаляя все: # rm -rf /
  • Как я могу использовать nohup, если сценарий оболочки занимает больше времени для запуска?
  • Исправить окна 8 efi MBR - нет успеха
  • Как определить, какой процесс открыт в Linux?
  • Как удалить все, кроме 10 самых новых файлов в Linux?
  • Давайте будем гением компьютера.