У меня есть несколько изображений, хранящихся в наборе организованных папок. Мне нужно изменить размер этих изображений на определенный процент рекурсивно из их родительского каталога. Я запускаю Ubuntu 11.10, и мне нравится учиться, как это сделать непосредственно с терминала.
Как пакетно изменить размеры изображений в Ubuntu рекурсивно в терминале?
Ответ 1
Вы можете использовать imagemagick. Например, для изменения размера всех изображений JPG в текущем каталоге до 50% от их первоначального размера вы можете сделать:
for f in `find . -name "*.jpg"`
do
convert $f -resize 50% $f.resized.jpg
done
Полученные файлы будут иметь ".jpg" дважды в их именах. Если это проблема, вы можете проверить следующие варианты.
Для перемещения/поиска файлов для изменения размера вы можете использовать xargs. Пример:
find . -name "*.jpg" | xargs convert -resize 50%
Это создаст копии изображений. Если вы просто хотите их преобразовать, вы можете использовать:
find . -name "*.jpg" | xargs mogrify -resize 50%
Ответ 2
Расширение ответа от @betabandido
Если существуют пробелы в именах файлов или именах папок, в которых находятся изображения, тогда следует использовать -print0 с find и -0 с xargs, чтобы избежать ошибок синтаксического анализа.
find . -name "*.jpg" -print0 | xargs -0 convert -resize 50%
find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%
Ответ 3
Он также работает, если вы дадите новое разрешение размера:
convert $f.jpg -size 1024x768 $f.resized.png
Ответ 4
Вы также можете использовать
sudo apt-get install nautilus-image-converter
Но это работает только для изображения в текущей папке. Вы просто устанавливаете, а затем щелкаете правой кнопкой мыши по изображению или нескольким, и выбираете нужный размер и что он.
Я считаю, что это также использует imagemagick.
Ответ 5
Вы можете использовать инструмент imagemagick для изменения размера партии.
Он будет поддерживать соотношение сторон
$ convert dragon.gif -resize 64x64 resize_dragon.gif
Он не будет поддерживать соотношение сторон
$ convert dragon.gif -resize 64x64\! exact_dragon.gif
$ cat resize.sh
#!/bin/bash
for f in `find . -name "*.jpg"`
do
convert $f -resize 45x60\! $f.resize.jpg
done
Он изменит размер изображения на 45x60, не поддерживая соотношение сторон в текущем каталоге.
Ответ 6
есть несколько ответов вроде:
find . -name "*.jpg" | xargs convert -resize 50%
это не будет работать, так как оно расширит список следующим образом:
convert -resize 50% a.jpg b.jpg c.jpg
, который изменит размер a.jpg
на c-0.jpg
, b.jpg
на c-1.jpg
и c.jpg
нетронутым.
Итак, вам нужно выполнить команду resize для каждого совпадения и указать имя входного файла и имя выходного файла с чем-то вроде:
find . -name "*.jpg" | xargs -n 1 sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'
каждое соответствие find
индивидуально передается xargs -n 1
на размер script: sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'
.
Этот script получает имя файла в аргументе $0
, использует sed
для создания имени выходного файла путем замены исходного суффикса .jpg
на -th.jpg
.
И он запускает команду convert
с этими двумя именами файлов.
Вот версия без xargs
, но find -exec
:
find -name '*.jpg' -exec sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')' {} \;
Ответ 7
Вы можете скопировать/вставить этот код в ubuntu и сохранить его как "resize.sh"
#!/bin/bash -e
CUR_DIR = `pwd`
cd $1
#resize
для файла в *.jpg;
do
конвертировать $file -resize 50% $file;
сделать
cd $CUR_DIR