29Jun

Het vinden van PNG-afbeeldingen groter dan x Pixels via de Linux Shell

click fraud protection

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 de inhoud van uw artikel. 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 worden om in het nieuwe ontwerp te passen.

Omdat ik een programmeur ben, zou het makkelijk voor me zijn om een ​​kleine applicatie te schrijven om dit te doen, maar het zette me aan het denken. .. waarom kan ik dit niet doen op de Linux-opdrachtregel?

Het eerste wat ik ontdekte was dat PNG-afbeeldingen de groottegegevens weergeven wanneer je de opdracht "file" op ze uitvoert:

$ file image3.png
image3.png: PNG-afbeeldingsgegevens, 613 x 657, 8-bits / kleurRGBA, 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:

instagram viewer

$ voor f in *. png; do file $ f; done

image.png: PNG-afbeeldingsgegevens, 631 x 185, 8-bits / kleurRGBA, non-interlaced
image1.png: PNG-afbeeldingsgegevens, 631 x 96, 8-bit / color RGBA, non-interlaced
image10.png: PNG-afbeeldingsgegevens, 375 x 395, 8-bit / color RGBA, non-interlacedinterlaced
image11.png: PNG-afbeeldingsgegevens, 484 x 241, 8-bit / color RGBA, non-interlaced
-versnippeld-

Dit is nuttiger, maar ik zou de gegevens in Excel of een vergelijkbare toepassing moeten ophalen inom de gegevens te sorteren, dus ik besloot om de linux "cut" -opdracht te gebruiken om alleen de kolom width uit te trekken.

Je zult opmerken dat de -f5 parameter vertelt knip om de vijfde kolom te nemen, en de -d \ met een spatie nadat het 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
-snipped-

Niet helemaal bruikbare uitvoer, toch? Laten we dat door een bash if-instructie duwen en dan alleen de uitvoer van de bestandsopdracht weergeven als 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 je spaties rond elke zijde van de haakjes nodig hebt []

voor f in *. png; do if [`file $ f |cut -f5 -d \ `-gt 600];file $ f; fi; done

image.png: PNG-afbeeldingsgegevens, 631 x 185, 8-bit / color RGBA, non-interlaced
image1.png: PNG-afbeeldingsgegevens, 631 x 96, 8-bit / color RGBAniet-geïnterlinieerd
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
-snipped-

Nu hebben we een lijst met alle bestanden groter dan 600 pixels breed. Aan het einde kon je het "bestand $ f" aanpassen om de bestandsnamen gewoon uit te spelen als je ze ergens anders naartoe moest kopiëren of verplaatsen:

voor f in *. png; do if [`file $ f |cut -f5 -d \ `-gt 600];dan echo $ f; fi; done

image.png
image1.png
image17.png
image18.png
-gesepped-

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 dat nodig is.