29Jun

Znalezienie obrazów PNG większych niż x pikseli w powłoce systemu Linux

Kiedy próbujesz pracować nad zmianą projektu swojej witryny, musisz się martwić o szerokość zdjęć w treści artykułu. Mam bardzo duże zrzuty ekranów na większości artykułów, które napisałem, więc jeśli chcę zwiększyć pasek boczny, ważne jest, aby dowiedzieć się, które obrazy będą zbyt szerokie, aby pasowały do ​​nowego projektu.

Ponieważ jestem programistą, byłoby mi łatwo napisać do tego małą aplikację, ale zacząłem myśleć. .. dlaczego nie mogę tego zrobić na linii poleceń Linuksa?

Pierwszą rzeczą, jaką odkryłem, było to, że obrazy PNG wyświetlają dane o rozmiarze po uruchomieniu polecenia "file":

$ file image3.png
image3.png: Dane obrazu PNG, 613 x 657, 8-bit / kolorRGBA, bez przeplotu

Bardzo przydatne, ponieważ 99% obrazu na tej stronie ma format PNG.Więc teraz wyrzućmy to w pętlę dla wszystkich plików w moim katalogu upload:

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

image.png: dane obrazu PNG, 631 x 185, 8-bit / kolorRGBA, bez przeplotu
image1.png: Dane obrazu PNG, 631 x 96, 8-bit / kolor RGBA, bez przeplotu


image10.png: Dane obrazu PNG, 375 x 395, 8-bit / kolor RGBA, niez przeplotem
image11.png: dane obrazu PNG, 484 x 241, 8-bitowe / kolorowe RGBA, bez przeplotu
-snipped-

Jest to bardziej przydatne, ale musiałem pobrać dane do Excela lub podobnej aplikacji waby sortować dane, zdecydowałem się użyć polecenia "cut" linuxa, aby wyciągnąć tylko kolumnę szerokości.

Zauważysz, że parametr -f5 mówi, że cut ma pobrać piątą kolumnę, a -d \ z spacją po tym, jak poleci cut, aby użyć spacji jako separatora. Slash \ character to znak ucieczki, który nakazuje powłoce używać spacji jako postaci, a nie jako białych znaków.

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

631
631
375
484
-snipped-

Niezupełnie przydatne wyjście, czyż nie? Przepuśćmy to przez instrukcję bash, a następnie pokażmy tylko wynik polecenia file, gdy szerokość jest większa niż 600 pikseli.

Zwróć uwagę na znaczniki ``( backtick) dookoła "pliku $ f |cut. .. "sekcja, która wskazuje, że polecenia wewnątrz` będą przetwarzane jako pojedyncze wyjście i podawane do instrukcji if, gdzie używamy opcji -gt( większej niż).Zwróć też uwagę, że potrzebujesz spacji po obu stronach nawiasów []

dla f in *. png; do if [`file $ f |cut -f5 -d \ `-gt 600];następnie plik $ f; fi; done

image.png: dane obrazu PNG, 631 x 185, 8-bit / kolor RGBA, bez przeplotu
image1.png: dane obrazu PNG, 631 x 96, 8-bit / kolor RGBA, bez przeplotu
image17.png: Dane obrazu PNG, 638 x 340, 8-bit / kolor RGBA, bez przeplotu
image18.png: Dane obrazu PNG, 608 x 448, 8-bit / kolor RGBA, bez przeplotu
-snipped-

Teraz mamy listę wszystkich plików większych niż 600 pikseli. Możesz ustawić "plik $ f" na końcu, aby tylko echo nazwy plików, jeśli musisz skopiować lub przenieść je gdzie indziej:

dla f w *. png; zrobić, jeśli [`plik $ f |cut -f5 -d \ `-gt 600];następnie echo $ f; fi; done

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

Powłoka Linux jest niesamowicie potężna! To rozwiązanie nie jest praktyczne dla wszystkich, ale dobrze jest wiedzieć, jak pracować z powłoką, aby można było wykonać to zadanie, kiedy trzeba.