web-dev-qa-db-fra.com

Rechercher et rechercher dans tous les fichiers compressés

Je voudrais analyser mon disque dur pour toutes les collections de fichiers compressés tels que Zip, gzip, bzip et autres et faire en sorte que le contenu de ceux-ci soit recherché pour certains types de fichiers (tels que des images). L'antivirus le fait, alors je crois qu'il devrait y avoir un moyen.

9
6ft Dan

L'approche la plus simple consisterait à répertorier le contenu de l'archive et à rechercher des fichiers avec l'extension correspondante. Par exemple, avec un fichier Zip:

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

L'option -sf indique à Zip de répertorier les fichiers contenus dans une archive. Ensuite, le grep recherchera un .png ou .jpg qui se trouvent à la fin de la ligne ($). Le -E active les expressions régulières étendues. Nous pouvons donc utiliser | comme OR et le -i rend la correspondance insensible à la casse.

Cependant, chaque outil d'archivage dispose d'une commande différente pour répertorier le contenu. J'ai écrit un script qui peut traiter la plupart des plus populaires. Si vous enregistrez ce script sous le nom list_compressed.sh, vous pourrez alors exécuter:

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

Cela vous montrerait les types d'image les plus courants. Notez que cette approche suppose que le type de fichier peut être déterminé par l'extension du fichier. Il ne trouvera pas les fichiers image sans extension ni les fichiers avec une extension incorrecte. Il n’ya aucun moyen de régler ce problème sans extraire réellement les fichiers de l’archive et exécuter file sur chacun d’eux.


Si vous souhaitez rechercher toutes les archives contenant des fichiers image sur votre disque dur, combinez ce qui précède avec 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

La commande find va rechercher tous les fichiers .gz, .tgz ou .Zip (vous pouvez ajouter autant d'extensions que vous le souhaitez). Celles-ci sont ensuite transmises à travers mon script. Le -q supprime la sortie normale de grep, rien ne sera imprimé. Le && echo n'imprimera le nom de l'archive que si le grep a réussi.

17
terdon

Pas aussi avancé que terdon, mais cela fera:

Enregistrez le code suivant dans un dossier contenant tout votre code, sous le nom finda.sh, ou tout autre nom de votre choix:

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

Ensuite, dans un répertoire où toutes vos archives se trouvent, lancez-la et voici le résultat:

./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
3
blade19899