ImageMagick 在多个文件上进行转换

ImageMagick 在多个文件上进行转换

我的目录中有 3 个文件:

aaa.jpg    
bbb.jpg  
ccc.jpg  

我可以使用 ImagkMagick 转换来缩小图像:

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  

我该怎么做呢?

答案1

文档中的内容很模糊,但你可以通过shell glob 到convert(引用以防止 shell 过早扩展它),并使用文件名百分比转义以以下形式构造输出文件名%[filename:label](其中label是任意用户指定的标签),使用输入基本名称转义%[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

答案2

man bash在 for 循环中,可以使用

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

这在 中有效,这是 Ubuntu 的标准 shell。我认为它比 Steeldriver (仅使用而不使用构造)bash的优雅方法更容易记住。convertfor

答案3

mkdir small
for f in *.jpg ; do convert $f -resize 1200x900 small/$f ; done

相关内容