Procurando por uma string em vários arquivos zip

20

Eu tenho uma pasta que contém cerca de 200 arquivos zip. Cada arquivo zip contém apenas um arquivo de texto. Eu gostaria de procurar por uma string específica em todos os arquivos de texto em todos os arquivos zip.

Eu tentei isso (que procura por qualquer arquivo de texto no arquivo zip que contenha a string "ORA-"), mas não funcionou.

zipgrep ORA-1680 *.zip

Qual é o correto de fazer isso sem descompactar os arquivos zip (em um SunOS 5.10)?

    
por ziggy 11.08.2011 / 13:25

3 respostas

23

Em geral, não é possível procurar conteúdo em um arquivo compactado sem descompactá-lo de uma forma ou de outra. Como o zipgrep é apenas um shellscript, envolvendo o unzip e o egrep, você pode fazê-lo manualmente:

for file in *.zip; do unzip -c "$file" | grep "ORA-1680"; done

Se precisar apenas da lista de arquivos zip correspondentes, você pode usar algo como:

for file in *.zip; do
    if ( unzip -c "$file" | grep -q "ORA-1680"); then
        echo "$file"
    fi
done

Desta forma, você está apenas descompactando para stdout (ou seja, para a memória) em vez de descompactar os arquivos para o disco. É claro que você pode tentar apenas grep -a dos arquivos zip, mas dependendo do conteúdo do arquivo e do seu padrão, você pode obter falsos positivos e / ou falsos negativos.

    
por 11.08.2011 / 13:42
13

zipgrep aceita um único arquivo. Para fazê-lo funcionar em vários arquivos, coloque-o em um loop:

for i in *.zip
do
   zipgrep ORA-1680 "$i"
done
    
por 11.08.2011 / 14:31
3

O sistema de arquivos AVFS apresenta uma visão do sistema de arquivos em que cada arquivo /path/to/foo.zip está acessível como um diretório ~/.avfs/path/to/foo.zip# . É um sistema de arquivos FUSE , que você pode instalar no Solaris. O AVFS fornece acesso somente leitura aos formatos de arquivo mais comuns.

mountavfs
for z in ~/.avfs$PWD/*.zip; do
  find "$z#" -exec grep ORA-1680 {} +
done
fusermount -u ~/.avfs   # optional
    
por 11.08.2011 / 19:08

Tags