Unix 'grep' para uma string dentro de todos os arquivos gzip em todos os subdiretórios

8

Como eu faço grep para uma string recursivamente através de todos os arquivos .gz em todos os diretórios e subdiretórios?

    
por Peter Mortensen 21.05.2010 / 12:21

4 respostas

13

@Steve Weet está quase lá. O uso de / dev / null como um 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 o mínimo de vezes possível, aproveitando ao máximo 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 comando find . O uso das opções -print0 e -0 permite que ele 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 {} +
    
por 21.05.2010 / 21:18
1
$ 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 {} \
    
por 21.05.2010 / 12:24
1

@aioobe está quase lá. O comando fará o trabalho, mas não lhe dirá o nome do arquivo

O seguinte também deve informar o nome do arquivo:

find . -iname "*.gz" -exec zgrep PATTERN {} /dev/null \;

A adição de /dev/null garantirá que zgrep veja dois nomes de arquivos para mostrar o nome do arquivo se encontrar a string

EDITAR

Pesquisas adicionais revelam que, para minha máquina (OS / X), o argumento -exec a ser encontrado adicionará tantos nomes de arquivos quanto possível (semelhante à maneira como xargs se comporta).

    
por 21.05.2010 / 20:46
0

O seguinte funciona um tratamento em zsh

for archive in **/*.gz; do
    echo "[${archive}] "
    gzip -dc ${archive} | grep -n "String"
done

Também pode funcionar em bash , ksh , etc ...

    
por 21.05.2010 / 13:07

Tags