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