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?
Vous pouvez utiliser identify
à partir de imagemagick
et 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 identify
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'expression awk
ne 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 rm
par exemple), remplacez simplement $line
dans l'instruction awk
par $3
, la troisième colonne ne sera alors imprimée.
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
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
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).