Como eu faço grep para uma string recursivamente através de todos os .gzarquivos em todos os diretórios e subdiretórios?
Como eu faço grep para uma string recursivamente através de todos os .gzarquivos 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
xargsfornecerá o máximo de args (nomes de arquivos) ao zgrep e executará repetidamente até que tenha usado todos os arquivos fornecidos pelo findcomando. O uso das opções -print0e -0permite 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 {} +
-Hpara 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 -rpara passar por uma árvore ou se o -r não funcionar, canalizar a saída da descobertaxargs zgrep
/bin/zgrep: -r: option not supportedno meu sistema Ubuntu recém-instalado.
xargsvez 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/nullirá 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 -execargumento a ser encontrado adicionará tantos nomes de arquivo quanto possível (semelhante à maneira como xargsse 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).
-Hpara sempre mostrar o nome do arquivo com a linha correspondente, no GNU grep pelo menos, em vez do /dev/nullhack.