Encontre e pesquise dentro de todos os arquivos compactados

10

Gostaria de procurar no meu disco rígido todas as coleções de arquivos compactados, como zip, gzip, bzip e outros, e ter o conteúdo daqueles pesquisados ​​por determinados tipos de arquivo (como imagens). Anti-vírus ', então acredito que deve haver um caminho.

6ft Dan
fonte
@Rinzwind que pesquisará nos arquivos do arquivo morto, não na lista de arquivos. Ele encontrará arquivos contendo foomas não foo.png.
terdon
Pode ser útil verificar uma bomba Zip! +1
Sharad Gautam

Respostas:

18

A abordagem mais simples seria listar o conteúdo do arquivo e procurar arquivos da extensão relevante. Por exemplo, com um ziparquivo:

$ zip -sf foo.zip | grep -iE '\.png$|\.jpg$'
  file1.jpg
  file1.png
  file2.jpg
  file2.png

A -sfopção informa zippara listar os arquivos contidos em um arquivo morto. Em seguida, grepprocurará um .pngou .jpgque esteja no final da linha ( $). Ele -Epermite expressões regulares estendidas, para que possamos usar |como OR e -itorna a correspondência sem distinção entre maiúsculas e minúsculas.

No entanto, cada ferramenta de arquivamento possui um comando diferente para listar o conteúdo. Eu escrevi um script que pode lidar com a maioria dos mais populares. Se você salvar esse script como list_compressed.sh, poderá executar:

list_compressed.sh | grep -iE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$'

Isso mostraria os tipos de imagem mais comuns. Observe que essa abordagem pressupõe que o tipo de arquivo possa ser determinado pela extensão do arquivo. Ele não encontrará arquivos de imagem que não tenham extensão e não reconhecerá arquivos com a extensão errada. Não há como lidar com isso sem realmente extrair os arquivos do arquivo morto e executar fileem cada um deles.


Se você deseja encontrar todos os arquivos que contêm arquivos de imagem no disco rígido, combine o acima com find:

find / -name '*.gz' -o -name '*.tgz' -o -name '*.zip' -print0 |
    while IFS= read -r -d '' arch; do    
        list_compressed.sh "$arch" | 
            grep -qiE '\.png$|\.jpg$|\.jpeg$|\.gif$|\.tif$|\.tiff$' &&
                echo "$arch contains image(s)"
    done

O comando find irá procurar por todos .gz, .tgzou .ziparquivos (você pode adicionar quantas extensões quiser), que são passados ​​pelo meu script. Os -qsuprime grep sua saída normal, nada será impresso. Ele && echoimprimirá o nome do arquivo apenas se ele tiver grepsido bem-sucedido.

Terdon
fonte
De acordo com a minha pergunta original, eu gostaria de "procurar no meu disco rígido todas as coleções de arquivos compactados, como zip, que contêm imagens". Você ajudou a procurar nos arquivos, mas quero apenas identificar quais arquivos contêm imagens.
6 Dan
@ 6ftDan desculpe, eu não tinha visto o original. Sinta-se à vontade para reverter ou reeditar qualquer edição que mude o significado da sua postagem. Consulte a resposta atualizada para saber como pesquisar em todo o sistema de arquivos.
terdon
Ótimo, mas como você está insensível a maiúsculas e minúsculas, talvez queira também pesquisar sem maiúsculas e minúsculas?
kos
@kos hmm, isso é fácil o suficiente para fazer apenas a mudança -namepara -iname. No entanto, há pouco sentido, muitos programas de compactação (gzip, por exemplo) precisam da extensão específica. GZnão vai funcionar.
terdon 8/08
3

Não é tão avançado quanto o terdon, mas isso fará:

Salve o código a seguir, em uma pasta na qual todo o seu código reside, como finda.shou qualquer outro nome que desejar:

for file in *.*; do
    if ( 7z l -slt "$file"> /tmp/$file.log); then
       echo $file:; cat /tmp/$file.log | grep -iE 'Path*'> $file.log && cat $file.log
    fi
done

Então, em um diretório em que todos os seus arquivos estão, execute-o e esta é a saída:

./finda.sh 
one.7z:
Path = one/abradabra.png
Path = one/birb.png
three.rar:
Path = three/blah.png
Path = three/qwa0g.jpg
two.zip:
Path = two/whut.png
blade19899
fonte
De acordo com a minha pergunta original, eu gostaria de "procurar no meu disco rígido todas as coleções de arquivos compactados, como zip, que contêm imagens". Você ajudou a procurar nos arquivos, mas quero apenas identificar quais arquivos contêm imagens.
6 Dan
@ 6ftDan Isso, eu acho que é possível, mas pode demorar um pouco. Nesse meio tempo, adicionei algumas melhorias ao meu script, com a ajuda do terdon.
precisa saber é o seguinte
Observe que *.*apenas corresponderá arquivos com uma extensão. Além disso, isso listará todos os arquivos em todos os arquivos, você não está testando nenhum tipo de arquivo.
terdon