Колдовство командной строки: пробелы в именах файлов с находкой | grep | xargs

Мне нужен способ выполнить 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 {}
5
задан 22.06.2012, 18:57

2 ответа

Вы ищете "привет 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" {} \; | ...
15
ответ дан 07.12.2019, 16:49

Можно сделать все это в одной команде, с помощью -exec аргумент find:

find . -name "*howdy doody*" -exec echo I found file {} hooray \;

Завершенная точка с запятой в конце команды для выполнения требуется find.

Или, если Вы смотрите в содержании файлов:

grep -R "howdy doody" *

Это покажет все текстовые соответствия, добавить -l к grep, чтобы просто получить список файлов

3
ответ дан 07.12.2019, 16:49

Теги

Похожие вопросы