Я хотел бы отсканировать все изображения в каталоге (рекурсивно в подпапках) и найти изображения с разрешением выше определенного порога (например, с разрешением не менее 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? Я должен сканировать миллионы изображений.
Через рекурсивный шарик удара и 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'