Procurando por uma sequência em vários arquivos zip

22

Estou trabalhando no SunOS 5.10. 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 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 contém a string "ORA-"), mas não funcionou.

zipgrep ORA-1680 *.zip

Qual é a maneira correta de fazê-lo sem descompactar os arquivos zip?

ziggy
fonte
Consulte também Como eu grep recursivamente através de arquivos compactados? (não é uma duplicata exata, porque os requisitos eram mais complicados).
Gilles 'SO- stop be evil' (

Respostas:

26

Geralmente, não é possível procurar conteúdo dentro de um arquivo compactado sem descompactá-lo de uma maneira ou de outra. Como o zipgrep é apenas um shellscript, envolvendo o descompactação e o egrep, você pode fazê-lo manualmente:

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

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

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

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

Noé
fonte
Para onde a primeira opção descompactaria os arquivos?
Ziggy
2
unzip -cdescompacta o arquivo em stdout. Ele não grava todo o arquivo descompactado em nenhum outro lugar.
Noah
+1 tks muito ele salva meu dia. Apenas adiciono o eco "$ file"; descompacte -c "$ file" | grep -q "ORA-1680"; para saber o nome do arquivo + o resultado.
Mike
2
Minha versão dos unzipusos -ppara transmitir para o pipe!
gavenkoa
Isso funciona, onde todos os comandos de linha única devolvidos "saída padrão", não um nome de arquivo +1
alimack
16

zipgrepleva 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
dogbane
fonte
2
Em uma linha que também imprimir zip filename, se houver uma correspondência:for i in *.zip; do zipgrep TextToSearch $i && echo $i; done
baptx
4

O sistema de arquivos AVFS apresenta uma visão do sistema de arquivos em que cada arquivo /path/to/foo.zipestá 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
Gilles 'SO- parar de ser mau'
fonte