Как я могу grep для строки рекурсивно через все .gz
файлы во всех каталогах и подкаталогах?
8
@ Steve Weet почти там. Использование / dev / null в качестве дополнительного аргумента является хорошим способом заставить имя файла отображаться (я буду помнить это, спасибо Стиву), но он все равно запускает exec для каждого найденного файла - огромные накладные расходы.
Вы хотите запускать zgrep как можно меньше раз, получая максимальную отдачу от каждого выполнения:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
предоставит zgrep столько аргументов (имен файлов), сколько возможно, и будет выполнять его несколько раз, пока не будут использованы все файлы, предоставленные find
командой. Использование параметров -print0
и -0
позволяет работать, если в именах файлов или каталогов есть пробелы.
В Mac OS X вы можете добиться того же эффекта без xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
чтобы всегда показывать имя файла с соответствующей строкой, по крайней мере, в GNU grep.Так что-то вроде
источник
zgrep -r
чтобы пройти по дереву, или, если -r не работает, перенаправить вывод поиска черезxargs zgrep
/bin/zgrep: -r: option not supported
вхожу в мою недавно установленную систему Ubuntu.xargs
вместо этого тогда.@aioobe почти там. Команда выполнит работу, но не сообщит вам имя файла
Следующее должно также сказать вам имя файла:
Добавление
/dev/null
гарантирует, что zgrep видит два имени файла, поэтому он покажет вам имя файла, если найдет строкуРЕДАКТИРОВАТЬ
Дальнейшие исследования показывают, что для моей машины (OS / X)
-exec
аргумент для поиска добавит столько имен файлов, сколько возможно (аналогично тому, какxargs
ведет себя).источник
-exec
- я все о переносимости, поэтому я бы не использовал его в скрипте, но отлично подходит для командной строки.find
, но к большинству современных (например, в дистрибутивах на основе Debian).-H
чтобы всегда показывать имя файла с соответствующей строкой, по крайней мере, в GNU grep, вместо/dev/null
взлома.Следующие работы угощение в
zsh
Это может также работать
bash
,ksh
и т. Д.источник