Freitag, 25. Mai 2012

Het vinden van PNG afbeeldingen groter dan X pixels Door de Linux Shell

Wanneer u probeert om te werken aan het wijzigen van de vormgeving van uw website, moet je bezig met de breedte van de foto's in uw artikel content. Ik heb notoir grote screenshots op de meeste van de artikelen die ik heb geschreven, dus als ik wil de sidebar is het cruciaal om erachter te komen welke foto's zullen worden te breed om te passen in het nieuwe ontwerp te verhogen.

Want ik ben een programmeur, zou het gemakkelijk voor mij om een ​​kleine applicatie om dit te doen schrijven, maar het maakte me gaan denken ... waarom kan ik niet doen op de Linux command line?

Het eerste wat ik bedacht was dat PNG-afbeeldingen de grootte gegevens weer te geven wanneer u de "file" commando over hen:

$ File image3.png
image3.png: PNG image data, 613 x 657, 8-bit/color RGBA, non-interlaced

Erg handig, aangezien 99% van het beeld op deze site zijn in PNG-formaat. Dus nu om te gooien in een lus voor alle bestanden in mijn upload directory:

$ Voor f in *. png, wees file $ f; gedaan

afbeelding.png: PNG image data, 631 x 185, 8-bit/color RGBA, non-interlaced
image1.png: PNG image data, 631 x 96, 8-bit/color RGBA, non-interlaced
image10.png: PNG image data, 375 x 395, 8-bit/color RGBA, non-interlaced
image11.png: PNG image data, 484 x 241, 8-bit/color RGBA, non-interlaced
-snipped-

Dit is meer nuttig, maar ik zou moeten om de gegevens te trekken in Excel of een soortgelijke applicatie om de gegevens te sorteren, dus heb ik besloten om de linux "cut" commando gebruiken om trek gewoon de breedte kolom.

U zult merken het-f5 parameter vertelt gesneden om de vijfde kolom te nemen, en de-d met een spatie achter vertelt gesneden om een ​​spatie als scheidingsteken te gebruiken. De schuine streep karakter is een escape-teken om de shell te vertellen om de ruimte te gebruiken als een karakter, en niet als witruimte.

$ Voor f in *. png, wees bestand $ f | cut-f5-d ; gedaan

631
631
375
484
-snipped-

Niet helemaal handig uitgang, toch? Laten we dat door middel van een duw bash if-statement, en dan alleen de output van het bestand commando laten zien wanneer de breedte groter is dan 600 pixels.

Let op de `(backtick) markeert rond de" file $ f | cut ... " sectie, die aangeven dat de commando's in de `zal worden verwerkt als een uitgang en ingevoerd in de if-statement, waar we gebruik van een-gt (groter dan). Merk ook op dat u ruimte rond beide kanten van de haakjes nodig []

for f in *. png; doen als [`bestand $ f | cut-f5-d `-gt 600], daarna bestand $ f, fi; gedaan

afbeelding.png: PNG image data, 631 x 185, 8-bit/color RGBA, non-interlaced
image1.png: PNG image data, 631 x 96, 8-bit/color RGBA, non-interlaced
image17.png: PNG image data, 638 x 340, 8-bit/color RGBA, non-interlaced
image18.png: PNG image data, 608 x 448, 8-bit/color RGBA, non-interlaced
-snipped-

Nu hebben we een lijst van alle bestanden die groter zijn dan 600 pixels breed. Je zou de "file $ f" aan te passen aan het eind gewoon echo uit de bestandsnamen als je die nodig zijn om te kopiëren of te verplaatsen ergens anders:

for f in *. png; doen als [`bestand $ f | cut-f5-d `-gt 600] then echo $ f, fi; gedaan

image.png
image1.png
image17.png
image18.png
-snipped-

De Linux-shell is ongelooflijk krachtig! Deze oplossing is niet echt praktisch voor iedereen, maar het is goed om te weten hoe te werken met de shell, zodat u kunt dit type taak uit te voeren wanneer dat nodig is.

Keine Kommentare:

Kommentar veröffentlichen