Comment find des files image par contenu

J'ai une list de files et j'ai besoin de find tous les files d' image de cette list.

Par exemple, si ma list contient ce qui suit:

pidgin.tar.gz photo01.jpg picture01 screenshot.gif invoice.pdf 

Ensuite, je voudrais seulement sélectionner:

 photo01.jpg picture01 screenshot.gif 

Remarques:

  • La méthode ne doit pas dépendre des extensions de file
  • Les formats d'image obscurs pour Photoshop et Gimp peuvent être ignorés. (Si feh ne peut pas le montrer, ce n'est pas une image)

La command suivante répertorie les lignes dans list_file contenant le nom d'un file image:

 <list_file xargs -d \\n file -i | sed -n 's!: *image/[^ :]*$!!p' 
  • file -i FOO regarde les premiers octets de FOO pour déterminer son format et imprime une ligne comme FOO: image/jpeg ( -i signifie montrer un type MIME, c'est spécifique au file GNU trouvé sur Linux).
  • xargs -d \\n lit une list de files (un par ligne) de l'input standard et y applique la command suivante. (Cela nécessite GNU xargs comme sur Linux, sur d'autres systèmes, laissez -d \\n , mais la list des files ne peut pas contenir \'" ou les espaces blancs).
  • La command sed filter le suffixe : image/FOO afin d'afficher simplement les noms de files. Il ignore les lignes qui ne correspondent pas aux files image.
 file -ib image | awk '"^image/" {print}' 

Si le file détecte une image, il devrait imprimer la ligne comme suit:

 image/jpeg; charset=binary 

Cela fonctionne sur les nombres magiques donc il n'est pas basé sur des extensions. Il

En plus de la command file , vous pouvez également utiliser ImageMagick. Le text suivant montre le type de tous les files du directory courant:

 find -type f -depth 0 -print0 | xargs -0 identify 

La command identify imprimera quelque chose comme ceci pour différents types de files:

 text.txt[8] TXT 612x792 612x792+0+0 16-bit DirectClass 694B 0.320u 0:00.330 php.jpg[31] JPEG 1280x1024 1280x1024+0+0 8-bit DirectClass 195KB 0.000u 0:00.000 

Les files GIF animés imprimeront plus d'informations (il s'agit d'un file GIF à 21 images):

 adhd.gif[0] GIF 211x200 211x200+0+0 8-bit PseudoClass 256c 233KB 0.000u 0:00.029 adhd.gif[1] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029 adhd.gif[2] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.029 ... adhd.gif[18] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000 adhd.gif[19] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000 adhd.gif[20] GIF 168x130 211x200+22+22 8-bit PseudoClass 256c 233KB 0.000u 0:00.000 

Vous pouvez ensuite utiliser awk ou des outils similaires pour décider quoi faire avec eux.

Si vous avez Python et python-magie . Par exemple

 #!/usr/bin/env python import magic import os path=sys.argv[1] mime = magic.open(magic.MAGIC_NONE) mime.load() for r,d,f in os.walk(path): for files in f: filename=os.path.join(r,files) filetype=mime.file(filename) if "image" in filetype: print "File: %s is %s" %(filename, filetype) 

Peut-être qu'il y a quelque chose qui me manque, mais cela semble fonctionner pour moi:

 file -i * | grep "image/" | cut -d: -f1