20 votes

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

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

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

Je suis sûr de pouvoir trouver toutes les images en utilisant find :

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

Mais qu'est-ce qui suit après le tuyau ? Quel paquet puis-je utiliser pour détecter les attributs des images ?

22voto

Vrolijk Points 1

Vous pouvez utiliser identify de imagemagick et 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> '{}' \; permet de s'assurer que les noms de fichiers peuvent contenir des espaces, vous pouvez aussi 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 dans identify est que vous pouvez spécifier le format de sortie ; dans ce cas-ci '%w %h %i' qui donne la largeur, la hauteur et le chemin complet de l'image. Ensuite, le awk expression 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

Edit : Si vous ne voulez que les noms de fichiers (pour le piping vers rm par exemple), il suffit de modifier $line dans le awk déclaration à $3 alors il n'imprimera que la troisième colonne.

2voto

osroflo Points 21

Cela a marché pour moi :

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

Voici l'échantillon de sortie :

./2520161636481000.png 75x75
./2620160819191100.png 75x75
./2420181545550700.png 75x75

1voto

István Zachar Points 1008

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

Bien que j'utilise ImageMagick outils le plus souvent maintenant moi-même, netpbm 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 va générer une sortie qui ressemble à :

stdin:  PPM raw, 1650 by 1275  maxval 255

Pour répondre à la question "qu'est-ce qui suit après le tuyau ?", j'utilise while read plus souvent que je n'utilise xargs parce qu'elle est plus flexible. Mon netpbm La ré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

0voto

chronitis Points 11442

El identify à partir du imagemagick Le paquet 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

Là encore, vous devrez utiliser grep pour trier la taille de l'image.

Cependant, je pense qu'à moins que vous ne disposiez d'une très large gamme de tailles d'images, il serait plus facile d'utiliser l'option find pour supprimer les fichiers JPEG en dessous d'une taille donnée :

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

(Il vaut la peine de fonctionner sans -delete pour vérifier qu'il ne trouve pas de choses que vous voulez garder - sinon, il ne vous le demandera pas avant la suppression).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X