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