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.


@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.


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.