Как делают меня grep для строки рекурсивно через все .gz
файлы во всех каталогах и подкаталогах?
@Steve Щебечут, почти там. Использование/dev/null как дополнительный аргумент является хорошим способом вынудить имя файла быть показанным (я буду помнить, что, Steve спасибо), но это все еще выполняет должностное лицо для каждого найденного файла - огромные издержки.
Вы хотите выполнить zgrep как несколько раз, как Вы можете, получая все возможное от каждого выполнения:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
предоставит как можно больше args (имена файлов) к zgrep и неоднократно выполнять его, пока это не использовало все файлы, предоставленные find
команда. Используя -print0
и -0
опции позволяют этому работать, если существуют пробелы на какое-либо из имен файла или каталога.
На Mac OS X можно достигнуть того же эффекта без xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
@aioobe почти там. Команда сделает задание, но не скажет Вам имя файла
Следующее должно сказать Вам имя файла также:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
Добавление /dev/null
гарантирует, что zgrep видит два имен файлов, таким образом, он покажет Вам название файла, если он найдет строку
Править
Дальнейшее исследование показывает это для моей машины (OS/X) -exec
аргумент для нахождения добавит как можно больше имен файлов (подобный пути xargs
ведет себя).