Как рекурсивно изменить размер изображения в Ubuntu в терминале?
У меня есть несколько изображений, хранящихся в наборе организованных папок. Мне нужно изменить размер этих изображений до определенного процента рекурсивно из их родительского каталога. Я использую Ubuntu 11.10 и предпочитаю учиться делать это прямо из терминала.
10 ответов
Вы могли бы использовать 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%
Вы также можете использовать
sudo apt-get install nautilus-image-converter
Но это работает только для изображения в текущей папке. Вы просто устанавливаете, а затем нажимаете правой кнопкой мыши на изображение или несколько изображений и выбираете нужный размер, и все.
Я считаю, что это также использует imagemagick.
Расширяя ответ от @betabandido
Если в именах файлов или имен папок, в которых находятся изображения, есть пробелы, то следует использовать -print0 с find и -0 с xargs, чтобы избежать ошибок синтаксического анализа.
find . -name "*.jpg" -print0 | xargs -0 convert -resize 50%
find . -name "*.jpg" -print0 | xargs -0 mogrify -resize 50%
Старый вопрос, но я считаю, что это самый простой метод, который также имеет дело с пробелами и нестандартными символами.
find -iname "*.jpg" -exec convert {} -resize 1280x1280 {} \;
(это мое решение с максимальным размером, но если вы хотите изменить размер в процентах, просто адаптируйтесь)
find -iname "*.jpg" -exec convert {} -resize 50% {} \;
Это также работает, если вы дадите новое разрешение изменения размера:
convert $f.jpg -size 1024x768 $f.resized.png
Я немного изменил код принятого ответа, чтобы включить файлы png и добавить префикс вместо постфикса к имени файла, чтобы упростить выбор всех файлов с измененным размером одновременно.
for p in `find . -name "*.jpg" -o -name "*.png"`
do
d=${p%/*}
f=${p##*/}
b=${f%.*}
e=${f##*.}
convert $p -resize 33% $d/thumb.$b.$e
done
С небольшой модификацией можно воссоздать структуру каталогов в отдельный каталог и иметь только файлы с измененным размером с той же структурой каталогов. Другим вариантом является выравнивание структуры каталогов и создание случайно сгенерированных имен файлов, а также сбор сопоставления путей с файлом CSV для каждого файла миниатюры с добавлением.
Вы можете использовать инструмент 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 без сохранения соотношения сторон в текущем каталоге.
Есть несколько ответов, таких как:
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
к скрипту изменения размера: sh -c 'convert -resize 50% $0 $(echo $0 | sed 's/\.jpg/-th\.jpg/')'
, Этот скрипт получает имя файла в аргументе $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/')' {} \;
Без XARGS и замены оригинала:
После многих часов борьбы с незнанием Linux (первый год) я наконец-то нашел для себя лучшее решение:
- использование ImageMagick;
- без XARGS;
- замена исходного файла;
- установка определенного максимального значения ширины и высоты с сохранением соотношения сторон (700 пикселей в следующем коде);
- включение вариантов регистра букв во избежание пропусков;
- рекурсивный поиск во всех подпапках.
Это код терминала:
for f in `find . -name "*.jpg" -or -name "*.JPG" -or -name "*.jpeg" -or -name "*.JPEG"` ; do convert "$f" -resize 700 "$f" ; done
Я надеюсь, что это поможет многим из вас; в любом случае он уже сохранен для моих будущих нужд.
Вы можете скопировать / вставить этот код в Ubuntu и сохранить его как "resize.sh"
#! / bin / bash -e
CUR_DIR = `pwd`
CD $ 1
#resize
для файла в *.jpg;
делать
конвертировать $file -resize 50% $file;
сделанный
CD $CUR_DIR