Como listar o conteúdo de todos os arquivos .zip em uma pasta e grep para um arquivo específico?

28

Eu tenho 348 arquivos zip e quero encontrar um arquivo que esteja em um dos arquivos zip, unzip -lnão funciona com curingas?

Como posso listar o conteúdo de todos os .ziparquivos e grepatravés da lista mesclada de todos os arquivos contidos nos zips?

Eduard Florinescu
fonte

Respostas:

17

Usar zipinfoé uma boa solução aqui. No entanto, em geral sempre que você deseja aplicar um comando a uma lista de arquivos e o comando não aceitar uma lista de arquivos, você pode usar um forloop:

for file in *.zip; do
    unzip -l "$file"
done \
| grep "\.zip\|setup"

Se o arquivo que você está procurando possui espaços como your file:, na expressão regular grep você precisa escapar de todos os espaços com uma barra invertida grep "\.zip\|your\ file".

Konrad Rudolph
fonte
Funciona perfeitamente o único problema é que ele não mostra o nome do zip,
Eduard Florinescu
Eu editei você postar e acrescentou expressão regular para exibir também o nome do arquivo onde a configuração é encontrado, um e aceito
Eduard Florinescu
Ah, sim, eu tinha esquecido as citações em torno da discussão unzip, que vergonha.
10249 Konrad Rudolph #:
1
@ JaySullivan Não use esse código, ele falhará nos caminhos que contêm espaços. Nunca canalize a saída de sl. Você poderia usar em seu findlugar.
Konrad Rudolph
12

Você pode usar zipinfo. Está incluído na instalação padrão do Ubuntu. Verifique a página do manual para mais informações.

Por exemplo, para procurar um padrão setupem vários arquivos zip no diretório atual, use este comando:

find ./ -iname *zip 2> /dev/null -print0 | xargs -0 zipinfo | grep setup
Anwar
fonte
Eu recebo um caution: filename not matched: case1.zip... caution: filename not matched: case348.zippara cada zip, testado em dois sistemas operacionais Ubuntu, 11.10 e 12.04.
Eduard Florinescu 6/10/12
@EduardFlorinescu Tente a resposta atualizada. Embora a resposta estava trabalhando para mim
Anwar
o problema é que o arquivo pode conter isso setupe coloca o mesmo erro, embora funcione assim:zipinfo -l * | grep "setup"
Eduard Florinescu
Eu editei a resposta. Eu acho que é mais robusto agora
Anwar
1
Obrigado, +1 pelo esforço, mas ainda assim não funcionará se o arquivo zip tiver espaços em seu nome.
Eduard Florinescu 6/10/12
6

Para listar os arquivos em um arquivo zip, você pode usar o seguinte comando.

unzip -l

Para grep um arquivo compactado, você deve usar os utilitários de arquivo compactado criados para trabalhar com esse tipo de formato de arquivo.

Para arquivos zip:

zipgrep --help  
usage: zipgrep [egrep_options] pattern zipfile [members...]
Uses unzip and egrep to search the zip members for a string or pattern.

Para arquivos tar:

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.

OPTIONs are the same as for 'grep'.

Existem algumas outras ferramentas que também funcionam com arquivos. Você pode canalizar a saída para grep para fazer a mesma coisa.

zcat
zcat my.archive.zip | grep "some text"

Ou você pode usar a funcionalidade de pesquisa dessas ferramentas

zless
zmore
nelaaro
fonte