Я хочу удалить все файлы, которые содержат строку foo
. Как я могу сделать это, используя bash в Linux?
linux
command-line
bash
find
Kitsos
источник
источник
foo
(например,myfoo.jpg
) или файлы, которые содержат последовательность байтовfoo
(которая может включать двоичные файлы, которые, как оказалось, содержат эту последовательность байтов)?Ответы:
Вот безопасный способ:
-l
печатает имена файлов, соответствующие шаблону поиска.-r
выполняет рекурсивный поиск шаблонаfoo
в заданном каталоге.
. Если это не сработает, попробуйте-R
.-I
(заглавнаяi
) приводит к пропуску двоичных файлов, таких как PDF.-Z
гарантирует, что имена файлов заканчиваются на ноль (т. е. на ноль), чтобы имя, содержащее пробелы, не интерпретировалось неправильно (т. е. как несколько имен вместо одного).xargs -0
кормит имена файлов изgrep
torm -f
, разделяя слова на ноль (ноль) байтов (запомните-Z
опцию fromgrep
).--
часто забывают, но очень важно отметить конец параметров и разрешить удаление файлов, имена которых начинаются с-
.Если вы хотите увидеть, какие файлы будут удалены, просто удалите
| xargs -0 rm -f --
деталь и оставьтеZ
флажок дляgrep
.Другой пользователь предложил что-то вроде следующего, которое вы не должны запускать, потому что это небезопасно:
Если у меня есть файлы,
ImportantStuff
которые я не хочу удалять иobsolete ImportantStuff
содержащиеfoo
, тогда я теряюImportantStuff
(и нетobsolete ImportantStuff
!), Когда запускаю эту команду, потому что она$files
разбивается на пробелы, когда она интерпретируется. Таким образом, опасно помещать список имен файлов в скалярную переменную оболочки.источник
Это рекурсивно ищет файлы, содержащие
foo
. Второе-exec
запускается только в том случае, если первоеexec
успешно завершено , т. Е. Еслиgrep
совпадает. Dryrun и удалите,echo
если вывод кажется правильным.Или в качестве альтернативы
и
как предполагает Лекенштейн.
источник
find -type f -exec grep -q 'foo' {} \; -delete
(кавычки{}
излишни,find
также может удалять файлы.). Обратите внимание, чтоgrep
принимает регулярное выражение. Если вы хотите выполнить поискfoo.bar
, либо избегите этого, либо передайте-F
опцию, чтобы рассматривать шаблон как литерал.-exec echo rm "{}" \;
и нет-delete
?-delete
. Проще продемонстрировать со вторым-exec
и эхо на месте.-print
(или-ls
для большей многословности), чем-exec echo rm "{}" \'
. Нет необходимости во внешних утилитах.Я бы сделал то, что говорит Адриан,
Но я бы добавил границы слов для foo, чтобы случайно не удалить файлы, содержащие «food» (если только он не удаляет все, что содержит food, то, что вам нужно).
На самом деле, я бы перенаправил вывод перед удалением, чтобы я мог просмотреть перед удалением:
источник