在bash中使用find命令时为文件生成uuids

时间:2014-06-22 22:27:59

标签: bash shell find cygwin imagemagick

我有点问题。 我正在搜索一些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只创建一次...

这可能是为什么会发生这种情况的原因? 我有什么方法可以解决这个问题吗?

1 个答案:

答案 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 '{}' \;