Тут багато плутанини, тому що існує не одна zgrep
. У мене в системі дві версії, zgrep
з gzip
і zgrep
з zutils
. Перший - це лише сценарій обгортки, який дзвонить gzip -cdfq
. Він не підтримує -r, --recursive
комутатор. 1
Остання являє собою c++
програму , і вона підтримує в -r, --recursive
опції.
Запуск zgrep --version | head -n 1
виявить, який з них (за наявності) є типовим:
zgrep (gzip) 1.6
це сценарій обгортки,
zgrep (zutils) 1.3
є cpp
виконуваним файлом.
Якщо у вас є останні, ви можете запустити:
zgrep 'pattern' -r --format=gz /path/to/dir
У будь-якому випадку, як було запропоновано, find
+ zgrep
буде однаково добре працювати з будь-якою з версій zgrep
:
find /path/to/dir -name '*.gz' -exec zgrep -- 'pattern' {} +
Якщо zgrep
відсутня у вашій системі (дуже малоймовірно), ви можете спробувати:
find /path/to/dir -name '*.gz' -exec sh -c 'gzip -cd "$0" | grep -- "pattern"' {} \;
але є головний мінус: ви не знатимете, де збігаються, оскільки ім'я файлу не призначається для відповідних рядків.
1: тому що це було б проблематично
zgrep
:zgrep - search possibly compressed files for a regular expression