Удалить список файлов с помощью find и grep

Я хочу удалить все файлы с именами, содержащими определенное слово, например. "автомобиль". До сих пор я придумал это:

find|grep car

Как передать вывод в rm?

Ответы

Ответ 1

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

или передайте вывод вашего конвейера в xargs:

find | grep car | xargs rm -f

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

Ответ 2

Чтобы просмотреть, что вы собираетесь удалить первым, поскольку rm -fr является такой, как опасная команда:

find /path/to/file/ | grep car | xargs ls -lh

Затем, если результаты вам нужны, запустите настоящую команду, удалив ls -lh и заменив ее на rm -fr

find /path/to/file/ | grep car | xargs rm -fr

Ответ 3

Мне нравится использовать

rm -rf $(find . | grep car)

Он выполняет именно то, что вы просите, логически управляя rm -rf на том, что grep car возвращает из вывода find ., который является рекурсивным списком всех файлов и папок.

Ответ 4

Вы действительно хотите использовать find с -print0 и rm с помощью --:

find [dir] [options] -print0 | grep --null-data [pattern] | xargs -0 rm --

Конкретный пример (удаление всех файлов под текущим каталогом, содержащим автомобиль в имени файла):

find . -print0 | grep --null-data car | xargs -0 rm --

Почему это необходимо:

  • -print0, --null-data и -0 изменяют обработку входных/выходных данных, анализируемых как токены, разделенные пробелами, на синтаксические разборы в виде токенов, разделенных символом \0. Это позволяет обрабатывать необычные имена файлов (подробнее см. man find).
  • rm -- позволяет фактически удалять файлы, начинающиеся с -, вместо того, чтобы обрабатывать их как параметры rm. Если есть файл с именем -rf и do find . -print0 | grep --null-data r | xargs -0 rm, файл -rf, возможно, не будет удален, но изменит поведение rm на других файлах.

Ответ 5

Он находит файл с соответствующим шаблоном (*.xml) и ищет его содержимое для соответствующей строки (exclude = "1") и удаляет этот файл, если совпадение найдено.

find . -type f -name "*.xml" -exec grep exclude=\"1\" {} \; -exec rm {} \;

Ответ 6

Немного некромантии, но вы также можете использовать find, grep и xargs

find . -type f | grep -e "pattern1" -e "pattern2" | xargs rm -rf

^ Поиск потребует некоторого внимания, чтобы он работал для ваших нужд потенциально, например, файл, mindepth, maxdepth и любое подталкивание.

Ответ 7

find start_dir -iname \*car\* -exec rm -v {} \;

Ответ 8

Вы можете использовать ls и grep, чтобы найти ваши файлы, и rm -rf, чтобы удалить файлы.

rm -rf $(ls | grep car)

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

Ответ 9

когда find | grep car | xargs rm -f find | grep car | xargs rm -f find | grep car | xargs rm -f получает результаты:

/path/to/car  
/path/to/car copy  

некоторые файлы, содержащие пробелы, не будут удалены.

Итак, мой ответ:

find | grep car | while read -r line ; do 
  rm -rf "${line}"
done

Таким образом, файл содержит пробелы могут быть удалены.