29Jun

Find PNG-billeder større end x pixel gennem Linux Shell

Når du forsøger at arbejde på at ændre designen af ​​dit website, skal du være bekymret for bredden af ​​billederne i dit artikelindhold. Jeg har notorisk store screenshots på de fleste artikler jeg har skrevet, så hvis jeg vil øge sidebjælken, er det afgørende at finde ud af, hvilke billeder der skal være for store til at passe ind i det nye design.

Da jeg er en programmør, ville det være let for mig at skrive en lille applikation til at gøre dette, men det fik mig til at tænke. .. hvorfor kan jeg ikke gøre det på Linux-kommandolinjen?

Det første jeg regnede med var, at PNG-billeder viser størrelsesdataene, når du kører kommandoen "fil" på dem:

$ file image3.png
image3.png: PNG-billeddata, 613 x 657, 8-bit / farveRGBA, ikke-interlaced

Meget nyttig siden 99% af billedet på dette websted er i PNG format. Så nu skal du smide det i en loop for alle filerne i min upload katalog:

$ for f i *. png; gør filen $ f; gjort

image.png: PNG billeddata, 631 x 185, 8-bit / farveRGBA, ikke-interlaced


image1.png: PNG-billeddata, 631 x 96, 8-bit / farve RGBA, ikke-interlaced
image10.png: PNG-billeddata, 375 x 395, 8-bit / farve RGBA, ikke-interlaced
image11.png: PNG-billeddata, 484 x 241, 8-bit / farve RGBA, ikke-interlaced
-cut-

Dette er mere nyttigt, men jeg skal trække dataene til Excel eller en lignende applikation ifor at sortere dataene, så jeg besluttede at bruge linux "cut" kommandoen til at trække ud bare bredden kolonnen.

Du vil bemærke, at -f5-parameteren fortæller skåret for at tage den femte kolonne, og -d \ med et mellemrum efter det fortæller skåret for at bruge et mellemrum som afgrænseren. Slash \ tegnet er et escape-tegn, der fortæller skallen at bruge rummet som et tegn, og ikke som whitespace.

$ for f i *. png; do file $ f | cut -f5 -d \; done

631
631
375
484
-cut-

Ikke helt nyttigt output, er det? Lad os skubbe det gennem en bash hvis erklæring, og så kun vise output fra filen kommando, når bredden er større end 600 pixel.

Bemærk de `(backtick) mærker omkring" filen $ f |skære. .. "sektion, som indikerer, at kommandoerne inde i` vil blive behandlet som en enkelt udgang og føres ind i if-sætningen, hvor vi bruger en -gt( større end).Bemærk også, at du har brug for mellemrum rundt om hver side af parenteserne []

for f i *. png; gør hvis [`fil $ f |cut -f5 -d \ `-gt 600];Derefter filen $ f; fi; done

image.png: PNG-billeddata, 631 x 185, 8-bit / farve RGBA, ikke-interlaced
image1.png: PNG-billeddata, 631 x 96, 8-bit / farve RGBA, ikke-interlaced
image17.png: PNG-billeddata, 638 x 340, 8-bit / farve RGBA, ikke-interlaced
image18.png: PNG-billeddata, 608 x 448, 8-bit / farve RGBA, ikke-interlaced
-cut-

Nu har vi en liste over alle filerne større end 600 pixels bred. Du kunne justere "fil $ f" i slutningen for blot at ekko filnavnene, hvis du skulle kopiere eller flytte dem et andet sted:

for f i *. png; gør hvis [`fil $ f |cut -f5 -d \ `-gt 600];så ekko $ f; fi; done

image.png
image1.png
image17.png
image18.png
-skåret-

Linux skal er utrolig kraftfuld! Denne løsning er ikke rigtig praktisk for alle, men det er godt at vide, hvordan man arbejder med skallen, så du kan udføre denne type opgave, når du har brug for det.