Como eu faço grep para uma string recursivamente através de todos os .gz
arquivos em todos os diretórios e subdiretórios?
8
@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.Então, algo como
fonte
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:
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 stringEDITAR
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 comoxargs
se comporta).fonte
-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.O seguinte trabalha um deleite em
zsh
Ele também pode trabalhar em
bash
,ksh
, etc ...fonte