20061117

Bash: Как обработать несколько файлов (уменьшить разрешение фото)

Допустим, у Вас есть некоторое количество фотографий, отснятых во время последней прогулки или поездки. Скорее всего, разрешение это фотографии в разрешении 3-6 мегапикселей. Это значит, что размер каждого файла с фотографией 1-2 мегабайта.

Этот размер чаще всего избыточен для простого выкладывания фотографии в сети или отправки по электронной почте. Обычно для просмотра на экране вполне годятся фотографии с разрешением 1 мегапиксель и менее.

Создать копии в низком разрешении из набора фотографий в высоком разрешении можно, конечно, вручную, загружая каждую фотографию в графический редактор, уменьшая и сохраняя под другим именем или в другом месте. Можно это сделать и без графического редактора, с помощью программы convert из пакета ImageMagick:

$ convert -quality 90 -resize 640x640 большое-фото.jpg уменьшенное-фото.jpg


Программа convert позволяет автоматизировать многие операции обработки графики. В данном случае она берёт файл (большое-фото.jpg), уменьшает до размера, не превышающего 640x640 (-resize 640x640), и сохраняет в формате JPEG с уровнем качества 90% (-quality 90) уменьшенное изображение в файле уменьшенное-фото.jpg.

А если файлов много? Просто и быстро это можно сделать сделать одной командой командной оболочки выполненной в каталоге с фотографиями:

$ mkdir lowres; for f in *.jpg ; do convert -quality 90 -resize 640x640 "$f" "lowres/${f%.jpg}-640.jpg" ; done


Что делает эта команда: создаёт подкаталог lowres в текущем каталоге (mkdir lowres); далее для всех файлов с разрешением .jpg (for f in *.jpg ; do ... ; done) вызывает программу конвертации (convert).

Программа ковертации сохраняет уменьшенные изображения в подкаталоге lowres под именем с окончанием -640.jpg. Так, если в исходном каталоге были изображения с именами мама.jpg, папа.jpg, я.jpg, то после выполнения указанной команды должен появиться подкаталог lowres/ с изображениями мама-640.jpg, папа-640.jpg, я-640.jpg. Изменённые имена файлов позволят не спутать их с исходными изображениями в высоком разрешении.

Набор команд между do и done повторяется несколько раз, для каждого файла подходящего по шаблону *.jpg. Имя обрабатываемого файла при этом хранится в "переменной" f. Запись $f позволяет получить это имя файла, а ${f%.jpg} отсекает (%) от имени файла окончание .jpg. Обратите внимание, что имена файлов берутся в двойные кавычки: "$f", "${f%.jpg}-640.jpg" -- это позволяет обрабатвать также имена файлов содержащие пробелы.

Конструкцию for f in шаблон ; do что сделать с каждым файлом ; done удобно использовать и для многих других целей. Например, для автоматического переименования или копирования файлов.