Это дополнительный вопрос из моего предыдущего вопроса, заданного здесь . Мне нужно найти и записать путь ко всем jpeg
изображениям в подкаталогах с разрешением, превышающим определенное число (например, более 800 по ширине).
Ну, есть миллионы изображений, и мне интересно, почему процесс find
ниже так медленен. Поэтому мне нужно оптимизировать скрипт bash, чтобы сделать его быстрее:
find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%d/%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'
Но есть одна интересная особенность: у меня есть 4 основных каталога (от 1 до 4), каждый из которых содержит 256 подкаталогов. Каждый из этих подкаталогов имеет около 5000 подкаталогов, каждый из которых имеет около 10 изображений. Так выглядит major_dir/subdir/subsubdir/10.jpg
. Интересной особенностью является то, что все изображения в этих подкаталогах имеют одинаковое разрешение; поэтому мне не нужно обрабатывать все эти 10 изображений. Если разрешение одного из них удовлетворяет, то мне просто нужно зарегистрировать один путь (путь к подкаталогу). С этим, я надеюсь, я получу в 10 раз большую скорость. Кроме того, все мои изображения .jpg
, если это тоже помогает.
Как я могу сделать это в скрипте bash? Таким образом, идеальный результат будет выглядеть следующим образом (path, width_of_images_there, height)
/path/to/sub_dir1, 1600, 1200
/path/to/sub_dir2, 1600, 1200
/path/to/sub_dir3, 3200, 2400
/path/to/sub_dir4, 1000, 800
Как насчет этого:
find /path/to/dir_with_major_dirs -path "*/*/*/*.jpg" -type f -exec bash -c '
for i; do
[[ "$p" = "${i%/*}" ]] || identify -format "%d, %w, %h\n" "$i"
p="${i%/*}"
done' _ {} + |
awk -F ',' '$2 > 800 && $3 > 600'
Этот тест для каждого файла jpg
обнаружил, совпадает ли его путь с путем предыдущего файла и только если он не запущен identify
. Выходные данные передаются в awk
, как вы уже поняли, я просто удалил /%f
из команды identify
, чтобы избавиться от ненужного имени файла.