Het vinden van PNG-afbeeldingen groter dan x Pixels via de Linux Shell
Wanneer u probeert te werken aan het wijzigen van het ontwerp van uw website, moet u zich zorgen maken over de breedte van de afbeeldingen in uw artikelinhoud. Ik heb notoir grote schermafbeeldingen van de meeste artikelen die ik heb geschreven, dus als ik de zijbalk wil vergroten, is het van cruciaal belang om erachter te komen welke foto's te breed zijn om in het nieuwe ontwerp te passen.
Omdat ik een programmeur ben, zou het gemakkelijk voor me zijn om een kleine applicatie te schrijven om dit te doen, maar het deed me denken ... Waarom kan ik dit niet doen op de Linux-opdrachtregel?
Het eerste wat ik ontdekte was dat PNG-afbeeldingen de groottegegevens weergeven als je de opdracht "file" op ze uitvoert:
$ file image3.png
image3.png: PNG-afbeeldingsgegevens, 613 x 657, 8-bit / color RGBA, non-interlaced
Zeer nuttig omdat 99% van de foto op deze site in PNG-formaat is. Dus nu om het in een lus te gooien voor alle bestanden in mijn uploaddirectory:
$ voor f in * .png; do file $ f; klaar
image.png: PNG-afbeeldingsgegevens, 631 x 185, 8-bit / color RGBA, non-interlaced
image1.png: PNG-afbeeldingsgegevens, 631 x 96, 8-bit / color RGBA, non-interlaced
image10.png: PNG-afbeeldingsgegevens, 375 x 395, 8-bits / kleuren RGBA, niet-geïnterlinieerd
image11.png: PNG-afbeeldingsgegevens, 484 x 241, 8-bit / color RGBA, non-interlaced
-geknipt-
Dit is nuttiger, maar ik zou de gegevens naar Excel of een vergelijkbare applicatie moeten slepen om de gegevens te sorteren, dus ik besloot om de linux "cut" -opdracht te gebruiken om alleen de kolom breedte uit te trekken.
Je zult opmerken dat de parameter -f5 de opdracht geeft om de vijfde kolom te nemen, en de -d \ met een spatie nadat hij zegt knippen om een spatie als scheidingsteken te gebruiken. Het slash \ -teken is een escape-teken om de shell te laten weten de ruimte als een teken te gebruiken en niet als witruimte.
$ voor f in * .png; do file $ f | cut -f5 -d \; done
631
631
375
484
-geknipt-
Niet helemaal bruikbare uitvoer, toch? Laten we dat door een bash if-statement duwen, en dan alleen de uitvoer van de bestandsopdracht weergeven wanneer de breedte groter is dan 600 pixels.
Let op de '(backtick) tekens rond het' bestand $ f | cut ... "sectie, die aangeeft dat de commando's in de 'worden verwerkt als een enkele uitvoer en ingevoerd in de if-instructie, waarbij we een -gt gebruiken (groter dan). Merk ook op dat u spaties rond beide zijden van de haakjes nodig heeft []
voor f in * .png; do if ['file $ f | cut -f5 -d \ '-gt 600]; vul dan $ f; fi; done in
image.png: PNG-afbeeldingsgegevens, 631 x 185, 8-bit / color RGBA, non-interlaced
image1.png: PNG-afbeeldingsgegevens, 631 x 96, 8-bit / color RGBA, non-interlaced
image17.png: PNG-afbeeldingsgegevens, 638 x 340, 8-bit / color RGBA, non-interlaced
image18.png: PNG-afbeeldingsgegevens, 608 x 448, 8-bit / color RGBA, non-interlaced
-geknipt-
Nu hebben we een lijst met alle bestanden groter dan 600 pixels breed. Aan het einde zou je het "bestand $ f" kunnen aanpassen om gewoon de bestandsnamen te laten uitkomen als je ze ergens anders zou moeten kopiëren of verplaatsen:
voor f in * .png; do if ['file $ f | cut -f5 -d \ '-gt 600]; dan echo $ f; fi; gedaan
image.png
image1.png
image17.png
image18.png
-geknipt-
De Linux-shell is ongelooflijk krachtig! Deze oplossing is niet echt praktisch voor iedereen, maar het is goed om te weten hoe je met de shell moet werken, zodat je dit soort taken kunt uitvoeren wanneer je.