Як знайти всі зображення з певним розміром пікселя за допомогою командної лінії?


16

Я намагаюся знайти всі зображення у форматі JPG у папці з підпапками, які мають ширину або висоту нижче 300 пікселів.

Таким чином я хочу виявити старі мініатюри та видалити їх.

Напевно, я можу знайти всі зображення за допомогою find:

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

Але що слідує за трубою? Який пакет я можу використовувати для виявлення атрибутів зображення?

Відповіді:


17

Ви можете використовувати identifyз imagemagick, а ви можете використовувати таку команду:

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

використання -exec <command> '{}' \;гарантує, що у вашому імені файлів можуть бути пробіли, або ви можете використовувати його

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

де -I{}піклується про те саме.

Мені подобається те identify, що ви можете вказати вихідний формат; у цьому випадку, '%w %h %i'що дає ширину, висоту та повне ім'я зображення. Тоді awkвираз зберігає лише ті рядки, для яких зображення менше потрібного розміру.

Приклад виходу:

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

Edit: Якщо ви хочете , тільки імена файлів (для трубопроводів до rm, наприклад), просто змінити $lineв awkзаяві $3, то він буде друкувати тільки третій стовпець.


3
Частину awk можна скоротити: | awk '$1<300||$2<300'або | awk '$1<300||$2<300{print $3}'(коли потрібен лише 3-й стовпець).
har-wradim

@ har-wradim Спасибі, приємна пропозиція!
Герхард Бургер

7
Мені довелося додати новий рядок ( '%w %h %i\n'), щоб він працював на мене.
qwr

Вибачте за те, що пишу в 6-річному питанні, але це єдиний результат, який я знаходжу в google, який частково надає моє запитання, в основному те, що я хочу, це знайти зображення з певними розмірами або в межах, а потім скопіювати їх в інший каталог. Я знаю, що cp використовується для копіювання, але мені не вдалося інтегрувати цю команду з cp.
GhostOrder

@GhostOrder виконайте пропозицію @ har-wradim надрукувати лише третю колонку, а потім додати ще одну трубу з чимось подібним| xargs -I {} mv {} /destination/directory/
Герхард Бургер

1

Я вважаю, що прийнята відповідь дуже гарна, але я хотів додати ще одне можливе рішення ...

Хоча я зараз використовую ImageMagickнайчастіше інструменти, netpbmале це давній друг для обробки зображень. Ви можете побачити розмір будь-якого формату зображення за допомогою команди:

anytopnm file | pamfile

Це дасть вихід, який виглядає так:

stdin:  PPM raw, 1650 by 1275  maxval 255

Щоб відповісти на питання «що слідує за трубою?», Я використовую while readчастіше, ніж я, xargsтому що вона більш гнучка. Моя netpbmвідповідь на питання виглядає приблизно так:

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

Це працювало для мене:

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

Це вихідний зразок:

./2520161636481000.png 75x75

./2620160819191100.png 75x75

./2420181545550700.png 75x75


0

identifyКоманда з imagemagickпакета робить те , що ви хочете:

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

Знову вам потрібно буде потім використовувати grepдля впорядкування розміру зображення.

Однак я підозрюю, що якщо у вас не дуже широкий діапазон розмірів зображень, було б простіше просто використовувати findдля видалення файлів JPEG нижче заданого розміру:

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

(Варто бігати без -delete попередньої перевірки, чи не знаходять речі, які ви хочете зберегти - інакше не буде запропоновано перед видаленням).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.