Encontre e pesquise dentro de todos os arquivos compactados

8

Gostaria de verificar meu disco rígido em busca de todas as coleções de arquivos compactados, como zip, gzip, bzip e outras, e ter o conteúdo delas pesquisado para determinados tipos de arquivos (como imagens). Anti-virus 'faz isso, então eu acredito que deve haver um jeito.

    
por 6ft Dan 08.06.2015 / 15:10

2 respostas

15

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

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

A opção -sf informa zip para listar os arquivos contidos em um arquivo. Em seguida, o grep procurará um .png ou .jpg que esteja no final da linha ( $ ). O -E ativa expressões regulares estendidas, portanto, podemos usar | como OR e o -i torna o caso de correspondência insensível.

No entanto, cada ferramenta de arquivo tem 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 mostra os tipos de imagem mais comuns. Observe que essa abordagem pressupõe que o tipo de arquivo pode ser determinado pela extensão do arquivo. Ele não encontrará arquivos de imagem que não tenham uma extensão e não reconhecerá arquivos com a extensão incorreta. Não há como lidar com isso sem realmente extrair os arquivos do archive e executar file em cada um deles.

Se você quiser encontrar todos os arquivos que contenham arquivos de imagem em seu 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 pesquisará todos os arquivos .gz , .tgz ou .zip (você pode adicionar quantas extensões quiser), depois elas serão passadas pelo meu script. O -q suprime a saída normal do grep, nada será impresso. O && echo imprimirá o nome do arquivo somente se o grep for bem-sucedido.

    
por terdon 08.06.2015 / 15:55
2

Não tão avançado quanto terdon, mas isso será o seguinte:

Salve o código a seguir, em uma pasta na qual todos os seus códigos residem, como finda.sh ou qualquer outro nome que você 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

Em seguida, em um diretório onde todos os seus arquivos estão, execute-os 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
    
por blade19899 08.06.2015 / 16:05