Como eu faço grep para uma string recursivamente através de todos os .gz
arquivos em todos os diretórios e subdiretórios?
Como eu faço grep para uma string recursivamente através de todos os .gz
arquivos em todos os diretórios e subdiretórios?
Respostas:
@Steve Weet está quase lá. O uso de / dev / null como argumento adicional é uma boa maneira de forçar a exibição do nome do arquivo (lembre-se disso, obrigado Steve), mas ele ainda executa o exec para cada arquivo encontrado - uma sobrecarga enorme.
Você deseja executar o zgrep quantas vezes puder, obtendo o máximo de cada execução:
find . -iname '*.gz' -print0 | xargs -0 zgrep PATTERN
xargs
fornecerá o máximo de args (nomes de arquivos) ao zgrep e executará repetidamente até que tenha usado todos os arquivos fornecidos pelo find
comando. O uso das opções -print0
e -0
permite que funcione se houver espaços em qualquer um dos nomes de arquivos ou diretórios.
No Mac OS X, você pode obter o mesmo efeito sem xargs:
find . -iname '*.gz' -exec zgrep PATTERN {} +
-H
para mostrar sempre o nome do arquivo com a linha correspondente, no GNU grep, pelo menos.
$ zgrep --help
Usage: /bin/zgrep [OPTION]... [-e] PATTERN [FILE]...
Look for instances of PATTERN in the input FILEs, using their
uncompressed contents if they are compressed.
Então, algo como
find . -iname "*.gz" -exec zgrep PATTERN {} \
zgrep -r
para passar por uma árvore ou se o -r não funcionar, canalizar a saída da descobertaxargs zgrep
/bin/zgrep: -r: option not supported
no meu sistema Ubuntu recém-instalado.
xargs
vez disso.
@aioobe está quase lá. O comando fará o trabalho mas não lhe dirá o nome do arquivo
O seguinte deve informar o nome do arquivo também:
find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;
A adição de /dev/null
irá garantir que zgrep veja dois nomes de arquivos para que ele mostre o nome do arquivo se ele encontrar a string
EDITAR
Pesquisas posteriores revelam que, para minha máquina (OS / X), o -exec
argumento a ser encontrado adicionará tantos nomes de arquivo quanto possível (semelhante à maneira como xargs
se comporta).
-exec
- eu sou todo sobre portabilidade, então eu não usaria isso em um script, mas ótimo para o prompt de comando.
find
, mas da maioria das modernas (por exemplo, em distros baseadas no Debian).
-H
para sempre mostrar o nome do arquivo com a linha correspondente, no GNU grep pelo menos, em vez do /dev/null
hack.