Comment trouver toutes les images avec une certaine taille de pixel en utilisant la ligne de commande?

16

J'essaie de trouver toutes les images JPG dans un dossier avec des sous-dossiers dont la largeur ou la hauteur est inférieure à 300 px.

De cette façon, je veux détecter les anciennes miniatures et les supprimer.

Pour sûr, je peux trouver toutes les images en utilisant find:

find . -iname "*.jpg" -type f | ...

Mais qu'est-ce qui suit après la pipe? Quel package puis-je utiliser pour détecter les attributs de l'image?

mcbetz
la source

Réponses:

17

Vous pouvez utiliser à identifypartir de imagemagicket vous pouvez utiliser la commande suivante:

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'

l'utilisation de -exec <command> '{}' \;s'assure que votre nom de fichier peut contenir des espaces, vous pouvez également utiliser

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'

où le -I{}s'occupe de la même chose.

Ce que j'aime, identifyc'est que vous pouvez spécifier le format de sortie; dans ce cas '%w %h %i'qui donne la largeur, la hauteur et le chemin complet de l'image. Ensuite, l' awkexpression ne conserve que les lignes pour lesquelles l'image est plus petite que la taille souhaitée.

Exemple de sortie:

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg

Modifier: si vous ne voulez que les noms de fichiers (pour la tuyauterie rmpar exemple), changez simplement $linela awkdéclaration en $3, alors cela n'imprimera que la troisième colonne.

Gerhard Burger
la source
3
La partie awk peut être raccourcie: | awk '$1<300||$2<300'ou | awk '$1<300||$2<300{print $3}'(lorsque seule la 3e colonne est nécessaire).
har-wradim
@ har-wradim Merci, belle suggestion!
Gerhard Burger
7
J'ai dû ajouter une nouvelle ligne ( '%w %h %i\n') pour que cela fonctionne pour moi.
qwr
Désolé d'avoir écrit une question de 6 ans, mais c'est le seul résultat que je trouve sur Google qui répond partiellement à ma question, ce que je veux essentiellement, c'est trouver des images avec ou dans des dimensions spécifiques, puis les copier dans un autre répertoire. Je sais que cp est utilisé pour copier, mais je n'arrive pas à intégrer cette commande avec cp.
GhostOrder
@GhostOrder suivez la suggestion de @ har-wradim pour imprimer uniquement la 3ème colonne, puis ajoutez un autre tuyau avec quelque chose comme ça| xargs -I {} mv {} /destination/directory/
Gerhard Burger
1

Je pense que la réponse acceptée est très bonne, mais je voulais ajouter une autre solution possible ...

Bien que j'utilise le ImageMagickplus souvent des outils maintenant, netpbmc'est un vieil ami pour le traitement des images. Vous pouvez voir la taille de n'importe quel format d'image avec la commande:

anytopnm file | pamfile

Cela générera une sortie qui ressemble à:

stdin:  PPM raw, 1650 by 1275  maxval 255

Pour répondre à la question "qu'est-ce qui suit après la pipe?", J'utilise while readplus souvent que j'utilise xargscar il est plus flexible. Ma netpbmréponse à la question ressemble à ceci:

find -iname \*.jpg | while read img; do \
  anytopnm "$img" | pamfile | \
    perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \
done
NateT
la source
1

Cela a fonctionné pour moi:

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

Voici l'exemple de sortie:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75

osroflo
la source
0

La identifycommande du imagemagickpackage fait ce que vous voulez:

$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000

Encore une fois, vous devrez ensuite utiliser greppour trier la taille de l'image.

Cependant, je soupçonne qu'à moins d'avoir une très large gamme de tailles d'image, il serait plus facile d'utiliser simplement findpour supprimer des fichiers JPEG en dessous d'une taille donnée:

find -iname '*.jpg' -size -10k -delete

( -deleteCela vaut la peine de courir sans d' abord vérifier qu'il ne trouve pas les choses que vous souhaitez conserver - il ne vous demandera pas avant la suppression sinon).

chronite
la source