29Jun

Recherche d'images PNG supérieures à x pixels via le shell Linux

Lorsque vous essayez de modifier la conception de votre site Web, vous devez vous soucier de la largeur des images dans le contenu de votre article. J'ai des captures d'écran notoirement grandes sur la plupart des articles que j'ai écrits, donc si je veux augmenter la barre latérale, il est essentiel de déterminer quelles images seront trop larges pour s'adapter au nouveau design.

Puisque je suis programmeur, il serait facile pour moi d'écrire une petite application pour faire cela, mais ça m'a fait réfléchir. .. pourquoi je ne peux pas le faire sur la ligne de commande Linux?

La première chose que j'ai compris est que les images PNG affichent les données de taille lorsque vous exécutez la commande "fichier" sur elles:

$ fichier image3.png
image3.png: données d'image PNG, 613 x 657, 8 bits / couleurRGBA, non entrelacé

Très utile puisque 99% de l'image sur ce site sont au format PNG.Alors maintenant pour le lancer dans une boucle pour tous les fichiers dans mon répertoire de téléchargement:

$ pour f dans *. png; faire le fichier $ f; fait

image.png: données d'image PNG, 631 x 185, 8 bits / couleurRGBA, non entrelacé
image1.png: données d'image PNG, 631 x 96, 8 bits / couleur RGBA, non entrelacé
image10.png: données d'image PNG, 375 x 395, RGBA 8 bits / couleur, nonentrelacé
image11.png: données d'image PNG, 484 x 241, 8 bits / couleur RGBA, non entrelacé
-snipped-

Ceci est plus utile, mais je devrais tirer les données dans Excel ou une application similaire dansAfin de trier les données, j'ai décidé d'utiliser la commande "cut" de linux pour extraire uniquement la colonne width.

Vous remarquerez que le paramètre -f5 dit à couper pour prendre la cinquième colonne, et le -d \ avec un espace après il dit couper pour utiliser un espace comme délimiteur. Le caractère slash \ est un caractère d'échappement pour indiquer au shell d'utiliser l'espace en tant que caractère, et non en tant qu'espace.

$ pour f dans *. png; fichier $ f | coupe -f5 -d \; fait

631
631
375
484
-snippé-

Sortie pas vraiment utile, n'est-ce pas? Poussons cela à travers une instruction bash if, et montrons seulement la sortie de la commande de fichier quand la largeur est supérieure à 600 pixels.

Notez les `marques( backtick) autour du" fichier $ f |cut. .. "section, qui indique que les commandes à l'intérieur du` seront traitées comme une seule sortie et introduites dans l'instruction if, où nous utilisons un -gt( supérieur à).Notez également que vous avez besoin d'espaces autour des parenthèses []

pour f dans *. png; faire si [`file $ f |coupe -f5 -d \ `-gt 600];puis fichier $ f; fi; fait

image.png: données d'image PNG, 631 x 185, 8 bits / couleur RGBA, non entrelacé
image1.png: données d'image PNG, 631 x 96, 8 bits / couleur RVBA, non entrelacé
image17.png: données d'image PNG, 638 x 340, 8 bits / couleur RGBA, non entrelacé
image18.png: données d'image PNG, 608 x 448, 8 bits / couleur RGBA, non entrelacé
-snipped-

Maintenant, nous avons une liste de tous les fichiers de plus de 600 pixels de large. Vous pouvez ajuster le "fichier $ f" à la fin pour simplement répercuter les noms de fichiers si vous avez besoin de les copier ou de les déplacer ailleurs:

pour f dans *. png; si if [`fichier $ f |coupe -f5 -d \ `-gt 600];then echo $ f; fi; fait

image.png
image1.png
image17.png
image18.png
-snippé-

Le shell Linux est incroyablement puissant! Cette solution n'est pas vraiment pratique pour tout le monde, mais il est bon de savoir comment travailler avec le shell pour pouvoir accomplir ce type de tâche quand vous en avez besoin.