ImageMagick конвертировать в несколько файлов
У меня есть 3 файла в каталоге:
aaa.jpg
bbb.jpg
ccc.jpg
Я могу уменьшить изображение, используя ImagkMagick convert:
convert aaa.jpg -resize 1200x900 aaa-small.jpg
Я хочу сделать все изображения в каталоге, например:
convert *.jpg -resize 1200x900 *-small.jpg
но это приводит к файлам с такими именами:
*-small-0.jpg
*-small-1.jpg
*-small-2.jpg
Я хочу:
aaa-small.jpg
bbb-small.jpg
ccc-small.jpg
Как мне это сделать?
3 ответа
В документации это досадно непрозрачно, но вы можете передать шелл-шаблон в
кавычкахconvert
(закавычен, чтобы предотвратить его преждевременное расширение оболочкой), и используйте Filename Percent Escapes для создания выходных имен файлов в форме
%[filename:label]
(куда
label
произвольная метка, указанная пользователем), используя escape-символ входного базового имени
%[basename]
или его устаревший эквивалент
%t
:
$ ls ???.jpg
aaa.jpg bbb.jpg ccc.jpg
тогда
$ convert '*.jpg' -set filename:fn '%[basename]-small' -resize 1200x900 '%[filename:fn].jpg'
в результате чего
$ ls ???-small.jpg
aaa-small.jpg bbb-small.jpg ccc-small.jpg
В цикле for можно использовать функции, описанные в
man bash
в
Parameter Expansion
...
${parameter%word}
${parameter%%word}
Remove matching suffix pattern. The word is expanded to produce a pattern just
as in pathname expansion. If the pattern matches a trailing portion of the
expanded value of parameter, then the result of the expansion is the expanded
value of parameter with the shortest matching pattern (the ``%'' case) or the
longest matching pattern (the ``%%'' case) deleted. If parameter is @ or *,
the pattern removal operation is applied to each positional parameter in turn,
and the expansion is the resultant list. If parameter is an array variable
subscripted with @ or *, the pattern removal operation is applied to each member
of the array in turn, and the expansion is the resultant list.
Следующий однострочник должен выполнить эту работу.
for f in ./*.jpg ; do convert "$f" -resize 1200x900 "${f%.jpg}-small.jpg" ; done
Это работает в
bash
, которая является стандартной оболочкой Ubuntu. Я думаю, что его легче запомнить, чем элегантный метод Steeldriver (который использует только
convert
и нет
for
построить).
mkdir small
for f in *.jpg ; do convert $f -resize 1200x900 small/$f ; done