Мне нужен способ выполнить grep в списке файлов, которые могут содержать пробелы в имени файла. В списке файлов без пробелов это является довольно прямым и легким. Кроме того, я знаю, как иметь дело с пробелами в именах файлов для находки и xargs. Я просто ищу способ использовать grep
с командой-print0.
Я ищу текст в файле, не в имени файла...
Это перечисляет все файлы:
find * -print 0 | xargs -0 -i{} echo {}
но скажите, что я должен сделать grep (или некоторая другая команда) промежуток.
Это перечисляет файлы, которые содержат "привет doody" в файле:
find * | xargs grep -l "howdy doody" | xargs -i{} echo {}
Это не работает, grep
не знает, как распознать пустые нагруженные линии. Я пропускал что-то в grep
страница справочника?
find * -print0 | xargs grep -l "howdy doody" | xargs -0 -i{} echo {}
Вы ищете "привет doody" в имени файла, или в файле?
# find files with "howdy doody" in the filename
find * -name "*howdy doody*" -print0 | xargs -0 ...
xargs
то, что необходимо использовать для разделения завершенного пустым указателем вывода от find -print0
. В Вашем примере, echo
является посторонним; не беспокойтесь им.
# find files containing "howdy doody"
find * -print0 | xargs -0 grep -l "howdy doody"
# find files containing "howdy doody" and do further processing
# multiple xargs version
find * -print0 | xargs -0 grep -l "howdy doody" | xargs -i{} do-something "{}"
# "sh -c" version
find * -print0 | xargs -0 -i{} sh -c 'grep -l "howdy doody" "{}" && do-something "{}"'
# notes:
# "sh -c" allows us to run a complex command with a single xargs
# "{}" handles spaces-in-filename
# handles any &&, ||, | command linking
Можно также выполнить команду непосредственно от find
с -exec
. Различие - это find -exec
выполняет команду однажды на найденный файл; xargs
добавляют имена файлов в конец команды (до системного предела), таким образом, это выполняет команду меньше раз. Можно моделировать это с xargs -n1
вызвать xargs
только выполнять одну команду на вход.
# grep once per file
find * -exec grep -l "howdy doody" {} \; | ...
Можно сделать все это в одной команде, с помощью -exec
аргумент find
:
find . -name "*howdy doody*" -exec echo I found file {} hooray \;
Завершенная точка с запятой в конце команды для выполнения требуется find
.
Или, если Вы смотрите в содержании файлов:
grep -R "howdy doody" *
Это покажет все текстовые соответствия, добавить -l
к grep, чтобы просто получить список файлов