Jak znaleźć wszystkie obrazy o określonym rozmiarze w pikselach za pomocą wiersza polecenia?


16

Próbuję znaleźć wszystkie obrazy JPG w folderze z podfolderami o szerokości lub wysokości poniżej 300 pikseli.

W ten sposób chcę wykryć stare miniatury i je usunąć.

Na pewno mogę znaleźć wszystkie obrazy, używając find:

find . -iname "*.jpg" -type f | ...

Ale co następuje po fajce? Którego pakietu mogę użyć do wykrycia atrybutów obrazu?

Odpowiedzi:


17

Możesz użyć identifyz imagemagicki możesz użyć następującego polecenia:

find . -iname "*.jpg" -type f -exec identify -format '%w %h %i' '{}' \; | awk '$1<300 || $2<300'

użycie -exec <command> '{}' \;powoduje, że twoja nazwa pliku może zawierać spacje, alternatywnie możesz użyć

find . -iname "*.jpg" -type f | xargs -I{} identify -format '%w %h %i' {} | awk '$1<300 || $2<300'

gdzie -I{}dba o to samo.

Podoba mi się identifyto, że możesz określić format wyjściowy; w tym przypadku, '%w %h %i'który podaje szerokość, wysokość i pełną nazwę ścieżki obrazu. Następnie awkwyrażenie zachowuje tylko te linie, dla których obraz jest mniejszy niż pożądany rozmiar.

Przykład wyniku:

64 64 ./thumbsup.jpg
100 150 ./photomin.jpg

Edycja: Jeśli chcesz tylko nazwy plików (dla rurociągów do rmna przykład), wystarczy zmienić $linew awkoświadczeniu $3, to będzie drukować tylko trzecią kolumnę.


3
Część awk można skrócić: | awk '$1<300||$2<300'lub | awk '$1<300||$2<300{print $3}'(gdy potrzebna jest tylko trzecia kolumna).
har-wradim

@ har-wradim Dzięki, miła sugestia!
Gerhard Burger

7
Musiałem dodać nowy wiersz ( '%w %h %i\n'), aby działał dla mnie.
qwr

Przepraszam, że napisałem w 6-letnim pytaniu, ale jest to jedyny wynik, który znajduję w google, który częściowo odpowiada na moje pytanie, w zasadzie to, czego chcę, to znaleźć obrazy o określonych wymiarach lub w określonych wymiarach, a następnie skopiować je do innego katalogu. Wiem, że cp służy do kopiowania, ale nie udało mi się zintegrować tego polecenia z cp.
GhostOrder

@GhostOrder postępuj zgodnie z sugestią @ har-wradim, aby wydrukować tylko trzecią kolumnę, a następnie dodać kolejną fajkę z czymś takim| xargs -I {} mv {} /destination/directory/
Gerhard Burger

1

Myślę, że zaakceptowana odpowiedź jest bardzo dobra, ale chciałem dodać inne możliwe rozwiązanie ...

Chociaż ImageMagickteraz najczęściej używam narzędzi, jestem netpbmstarym przyjacielem do przetwarzania obrazów. Możesz zobaczyć rozmiar dowolnego formatu obrazu za pomocą polecenia:

anytopnm file | pamfile

To wygeneruje dane wyjściowe, które wyglądają następująco:

stdin:  PPM raw, 1650 by 1275  maxval 255

Aby odpowiedzieć na pytanie „co następuje po potoku?”, Używam while readczęściej niż używam, xargsponieważ jest bardziej elastyczny. Moja netpbmodpowiedź na pytanie wygląda następująco:

find -iname \*.jpg | while read img; do \
  anytopnm "$img" | pamfile | \
    perl -ane 'exit 1 if $F[3]<300 || $F[5]<300' || rm -v "$img"; \
done

1

To działało dla mnie:

find . -iname "*.png" -type f -exec identify -format '%i %wx%h\n' '{}' \; | grep '75x75'

To jest próbka wyjściowa:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75


0

identifyKomenda z imagemagickpakietu robi to, co chcesz:

$ identify abc.jpg
abc.jpg JPEG 1952x3264 1952x3264+0+0 8-bit DirectClass 1.111MB 0.000u 0:00.000

Ponownie musisz użyć, grepaby uporządkować rozmiar obrazu.

Podejrzewam jednak, że jeśli nie masz bardzo szerokiego zakresu rozmiarów obrazów, łatwiej byłoby po prostu findusunąć pliki JPEG poniżej określonego rozmiaru:

find -iname '*.jpg' -size -10k -delete

(Warto uruchomić bez -deletesprawdzenia, czy nie znajduje rzeczy, które chcesz zachować - inaczej nie wyświetli monitu przed usunięciem).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.