web-dev-qa-db-fra.com

Comment trouver toutes les images avec une certaine taille de pixel en utilisant Commandline?

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

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

Bien 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 paquet puis-je utiliser pour détecter les attributs d'une image?

16
mcbetz

Vous pouvez utiliser identifyà partir de imagemagicket 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 votre nom de fichier peut contenir des espaces, sinon vous pouvez 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 identifyest 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'expression awkne conserve que les lignes pour lesquelles l'image est inférieure à la taille souhaitée.

Exemple de sortie:

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

Édition: Si vous souhaitez uniquement les noms de fichiers (pour la canalisation vers rmpar exemple), remplacez simplement $line dans l'instruction awkpar $3, la troisième colonne ne sera alors imprimée.

17
Gerhard Burger

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

./262016081919111100.png 75x75

./2420181545550700.png 75x75

1
osroflo

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

Bien que j'utilise les outils ImageMagick plus souvent maintenant, netpbm est un ancien ami pour le traitement des images. Vous pouvez voir la taille de tout 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 "Que fera-t-il après le tuyau?", J'utilise while read plus souvent que xargs car il est plus flexible. Ma réponse netpbm à la question se présente comme suit:

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
1
NateT

La commande identify du package imagemagick 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 alors utiliser grep pour trier la taille de l'image.

Cependant, je suppose que si vous n’avez pas une très large gamme de tailles d’images, il serait plus simple d’utiliser simplement find pour supprimer les fichiers JPEG d’une taille inférieure à une taille donnée:

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

(Cela vaut la peine d’être exécuté sans -delete d’abord pour vérifier s’il ne trouve pas ce que vous voulez conserver - il ne vous demandera pas d’être effacé avant la suppression).

0
chronitis