Rechercher et rechercher dans tous les fichiers compressés

10

Je voudrais analyser mon disque dur pour toutes les collections de fichiers compressés comme zip, gzip, bzip et autres et avoir le contenu de ceux recherchés pour certains types de fichiers (tels que les images). Anti-virus, faites-le, donc je pense qu'il devrait y avoir un moyen.

6ft Dan
la source
@Rinzwind qui recherchera dans les fichiers de l'archive, pas dans la liste des fichiers. Il trouvera les fichiers contenant foomais pas foo.png.
terdon
Cela peut être utile pour rechercher une bombe Zip! +1
Sharad Gautam

Réponses:

18

L'approche la plus simple serait de lister le contenu de l'archive et de rechercher les fichiers de l'extension concernée. Par exemple, avec un zipfichier:

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

L' -sfoption indique zipde lister les fichiers contenus dans une archive. Ensuite, le grepva rechercher un .pngou .jpgqui se trouvent à la fin de la ligne ( $). Le -Epermet des expressions régulières étendues, donc nous pouvons utiliser |comme OR et le -irend insensible à la casse correspondante.

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

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

Cela vous montrerait les types d'images 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 et ne reconnaîtra pas les fichiers avec la mauvaise extension. Il n'y a aucun moyen de gérer cela sans extraire les fichiers de l'archive et les exécuter filesur chacun d'eux.


Si vous souhaitez trouver 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 recherchera tous .gz, .tgzou .zipfichiers (vous pouvez ajouter autant d'extensions que vous le souhaitez), ceux-ci sont ensuite passés par mon script. Le -qsupprime la sortie normale de grep, rien ne sera imprimé. Le && echoaffichera le nom de l'archive uniquement si l'opération grepa réussi.

terdon
la source
Selon ma question d'origine, je voudrais "scanner mon disque dur pour toutes les collections de fichiers compressés, comme zip, qui contiennent des images". Vous avez aidé à rechercher les archives elles-mêmes, mais je veux juste identifier quelles archives contiennent des images.
6 pieds Dan
@ 6ftDan désolé, je n'avais pas vu l'original. N'hésitez pas à annuler ou à rééditer toute modification qui change la signification de votre message. Voir la réponse mise à jour pour savoir comment rechercher l'ensemble du système de fichiers.
terdon
Très bien, mais comme vous ne respectez pas la casse, vous souhaitez peut-être également effectuer une recherche sans tenir compte de la casse?
kos
@kos hmm, qui est assez facile à faire tout changement -nameà -iname. Cependant, cela ne sert à rien, de nombreux programmes de compression (gzip, par exemple) nécessitent l'extension spécifique. GZne fonctionnera pas.
terdon
3

Pas aussi avancé que terdon, mais cela fera:

Enregistrez le code suivant, dans un dossier où réside tout votre code, en tant que finda.shou tout autre nom comme vous le souhaitez:

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ù se trouvaient toutes vos archives, exécutez-le et voici la sortie:

./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
la source
Selon ma question d'origine, je voudrais "scanner mon disque dur pour toutes les collections de fichiers compressés, comme zip, qui contiennent des images". Vous avez aidé à rechercher les archives elles-mêmes, mais je veux juste identifier quelles archives contiennent des images.
6 pieds Dan
@ 6ftDan Cela, je pense que c'est possible, mais cela peut prendre un certain temps. En attendant, j'ai ajouté quelques améliorations à mon script, à l'aide de terdon.
blade19899
Notez que *.*ne correspondra que les fichiers avec une extension. En outre, cela répertoriera tous les fichiers dans toutes les archives, vous ne testez aucun type de fichier.
terdon