Как удалить файлы с помощью grep и rm?

grep -n magenta *| rm *

grep: a.txt: нет такого файла или каталога

grep: b: нет такого файла или каталога

выше команда удаляет все файлы в каталоге, за исключением ., .. . Он должен удалить только те файлы, которые содержат слово "magenta"

кроме того, попробовал grep magenta * -exec rm '{}' ; но не повезло. Есть идеи?

2 ответов


использовать xargs:

grep -l --null magenta ./* | xargs -0 rm

цель xargs состоит в том, чтобы взять ввод на stdin и поместить его в командную строку своего аргумента.

Что делать:

  • на -l опция говорит grep не печатать соответствующий текст и вместо этого просто печатать имена файлов, содержащих соответствующий текст.

  • на --null опция сообщает grep, чтобы разделить имена файлов с символами NUL. Это позволяет всем усадьбе filename для безопасной обработки.

  • на -0 опция для xargs для обработки его ввода как разделенных нулем.


вот безопасный способ:

grep -lr magenta . | xargs -0 rm -f --
  • -l печатает имена файлов, соответствующие шаблону поиска.
  • -r выполняет рекурсивный поиск шаблона magenta в данном каталоге ..  Если это не работает, попробуйте -R. (т. е. как несколько имен вместо одного).
  • xargs -0 подает имена файлов из grep to rm -f
  • -- часто забывают, но это очень важно чтобы отметить конец опций и разрешить удаление файлов, имена которых начинаются с -.

если вы хотите, чтобы увидеть, какие файлы будут удалены, просто удалите | xargs -0 rm -f -- часть.