Команда выполнения рекурсивно через подкаталоги

Я пытаюсь преобразовать набор изображений к миниатюрам, которые могли бы быть в нескольких подкаталогах, и сохранять копию изображения как миниатюра в подкаталоге, но я не могу выяснить синтаксис. Любой совет приветствовался бы.

convert test/*/*.jpg -50x50 test/*/*_thumb.jpg
4
задан 29 March 2017 в 16:25

2 ответа

Необходимо использовать, находят для нахождения всех файлов, в которых Вы нуждаетесь.

find test -iname *.jpg -exec convert {} -resize 50x50 {}_thumb \;

И затем необходимо переименовать файлы с именем *.jpg_thumb к *_thumb.jpg при помощи:

find -name *.jpg_thumb -exec rename -e 's/^(.*)(.jpg)(_thumb)$/\1\3\2/' '{}' \;

Примечание, что-50x50 не является легальным параметром для преобразования. Необходимо использовать -resize параметр со значением 50x50 как в примере выше.

4
ответ дан 1 December 2019 в 09:07

Цикл оболочки должен также сделать:

for file in test/*/*.jpg ; do
    new=${file%.jpg}_thumb.jpg 
    convert "$file" -resize 50x50 "$new"
done

Или с Bash globstar, который лучше, если файлы могут быть на произвольных уровнях каталога:

shopt -s globstar
for file in test/**/*.jpg ; do ...

${file%.jpg} принимает значение переменной file и удаляет строку .jpg от конца. (см. BashGuide на расширениях параметра),

4
ответ дан 1 December 2019 в 09:07

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

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