我有点问题。 我正在搜索一些jpg文件,并使用imagemagick对它们进行批量水印。
我在cygwin bash shell中运行以下命令:
find -iname '*.jpg' -execdir convert '{}' -resize 600x600 -fill white \
-undercolor '#00000080' -gravity SouthWest -annotate +0+5 \
$(uuidgen -r | grep -o "\w\{12\}" | tr '[:lower:]' '[:upper:]') {}-id.jpg \; \
-print
我遇到的问题是它似乎就行了:
$(uuidgen -r | grep -o "\w\{12\}" | tr '[:lower:]' '[:upper:]')
仅通过 find 命令运行一次,这反过来使得所有文件都具有完全相同的水印文本,这不是我的意图。
我还想用相同的水印文字命名所有文件,取而代之的是:
$(uuidgen -r | grep -o "\w\{12\}" | tr '[:lower:]' '[:upper:]') {}-id.jpg
用这个:
wid=$(uuidgen -r | grep -o "\w\{12\}" | tr '[:lower:]' '[:upper:]') $wid.jpg
显然,如果文件夹中有5个文件,则会创建1个并覆盖5次,因为uuid只创建一次...
这可能是为什么会发生这种情况的原因? 我有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
在执行shell之前,会扫描整个find
命令以进行扩展,并且正如您所说,命令扩展仅执行一次。最简单的方法是将整个-execdir
参数作为shell文件,并使用shell从find
命令执行它。
所以在你的主目录中创建一个名为watermark.sh
的文件,如下所示:
wid=$(uuidgen -r | grep -o "\w\{12\}" | tr '[:lower:]' '[:upper:]')
convert "$1" \
-resize 600x600 \
-fill white \
-undercolor '#00000080' \
-gravity SouthWest \
-annotate +0+5 $wid \
$wid.jpg
并按照以下方式编写find
命令:
find -iname '*.jpg' -execdir sh ~/watermark.sh '{}' \;