Найти изображения в каталоге Linux по их разрешению

Я хотел бы отсканировать все изображения в каталоге (рекурсивно в подпапках) и найти изображения с разрешением выше определенного порога (например, с разрешением не менее 800x600 или, если проще, например с шириной выше чем 1000 пикселей). Затем я хотел бы записать их адрес в текстовом файле, сопровождая их разрешение (или [width], [height] для лучшего форматирования).

Так log.txt будет выглядеть так:

/home/users/myuser/test/image1.jpg, 1800, 1600
/home/users/myuser/test/image20.jpg, 2800, 2600
/home/users/myuser/test/image30.jpg, 1500, 1200

Как я могу это сделать, используя скрипт bash? Я должен сканировать миллионы изображений.

6
задан 14 January 2019 в 20:32

1 ответ

Через рекурсивный шарик удара и ImageMagick identify команда:

shopt -s globstar
identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg}

При сохранении такого вывода в файл, просто вопрос добавления > mylog.txt к предыдущей команде, которая является

identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg} > mylog.txt

Оттуда, Вы могли использовать awk или perl выдерживать сравнение mylog.txt столбцы

awk -F ',' '$2 > 800 && $3 > 600' mylog.txt

awk здесь использование , как разделитель для столбцов и обычная структура для awk /PATTERN/{COMMANDS}, какие значения по умолчанию только к печати, если {COMMANDS} опущенный; в конкретном примере выше, если шаблон $2 > 800 && $3 > 600 верно, который является, это - изображение выше нужного разрешения, Вы получите распечатанный на экран.

И вероятно пропущение журнала ступает промежуточное, было бы немного лучше просто передать все по каналу:

shopt -s globstar
identify -format "%f, %w, %h\n" **/*.{png,jpg,jpeg} | awk -F ',' '$2 > 800 && $3 > 600' > filtered_images.txt

В случае, если Вы встречаетесь arguments list too long ошибка, обычно find команда является лучшим подходом для того, чтобы рекурсивно обойти дерево каталогов. identify может быть назван через find -exec флаг, и фильтрующий все еще может быть обработан awk:

$ find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600' 
fanart.jpg, 1920, 1080
fanart.jpg, 1920, 1080
globalsearch-background.jpg, 1920, 1080
fanart.jpg, 1280, 720

Как обычно, не забывайте добавлять > log2.txt сохранить все в файл.

Полный путь в файл мог быть обработан любым из двух способов. Один, путем определения %d/%f в identify строка формата команды или использование find -printf опция. Это также

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%d/%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'

Или

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -printf "%p, " -exec identify -format "%w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'
6
ответ дан 14 January 2019 в 20:32

Другие вопросы по тегам:

Похожие вопросы: