我想使用 ImageMagick 的convert
用于水平附加两幅图像的脚本。
这很容易做到convert +append input1.jpg input2.jpg output.jpg
。
但是我有一个 jpeg 文件目录。它们看起来像这样:
1996-0011-1 BEG Foo Bar Foo Bar.jpg
1996-0011-2 BEG Foo Bar Foo Bar.jpg
2001-0006-1 MEF FooBar.jpg
2001-0006-2 MEF FooBar.jpg
…
前四位数字表示年份,后四位数字表示一些连续的数字。-1
是预期输出文件的左侧部分,-2
右侧部分。文件名的其余部分是带有可变数量空格的字符串。
如何自动附加这两组图像convert
?我想可以通过独立于文件名处理第一、第二……对文件或根据文件名对这些文件进行分组来完成(这对于没有两张图片的用户来说很有帮助)。
我使用 OS X。感谢您的帮助。
答案1
假设两件事:
- 您可以使用 GNU bash 的合理现代版本或兼容的 shell
- 标识符部分后面总是
yyyy-nnnn-
跟着一个或多个数字(按顺序),后面跟着其他内容
然后你可以使用Bash 字符串操作并使用 shell 通配符扩展来实现您想要的效果。
在文件1996-0011-1 BEG Foo Bar Foo Bar.jpg
、1996-0011-2 BEG Foo Bar Foo Bar.jpg
和2001-0006-1 MEF FooBar.jpg
已经2001-0006-2 MEF FooBar.jpg
存在的目录中运行此命令。
$ ls -1
1996-0011-1 BEG Foo Bar Foo Bar.jpg
1996-0011-2 BEG Foo Bar Foo Bar.jpg
2001-0006-1 MEF FooBar.jpg
2001-0006-2 MEF FooBar.jpg
$ mkdir old
$ for filename in *.jpg; do
> test -f "$filename" && convert +append ${filename:0:10}* "${filename:0:9} ${filename:12}" && mv ${filename:0:10}* old/; done
$ ls -1
1996-0011 BEG Foo Bar Foo Bar.jpg
2001-0006 MEF FooBar.jpg
old/
$ rm -r old
$
对于目录中的每个 .jpg 文件,其工作方式如下:
- 测试文件是否存在并且是常规文件
- 如果文件存在,则运行
convert
,将文件名的前十个字符(从字符位置 0 开始,提取 10 个字符)传递给 shell 通配符扩展作为要转换的参数,后跟文件名的前九个字符,后跟一个空格,后跟从第 12 个字符开始的所有内容(您可以调整这部分以获得所需的输出文件名类型;确保对调用进行相应的调整mv
) - 如果
convert
运行成功,则将所有输入文件移动到单独的目录中,以免它们妨碍
最后,您将在当前目录中获得输出文件,并且所有输入文件将被移动到名为的目录中old
。 确保首先在非关键数据上测试上述代码片段。