上下文:zsh Catalina MacOS:
可执行脚本BatesStamp 使用imagemagick 将数字标记到 jpg 文件中:
# BatesStamp: OVERWRITES and stamps ONE file with COUNTER (upper left corner)
# usage ./BatesStamp COUNTER PATH_FILE
# to be used with find & -exec: https://unix.stackexchange.com/a/96239/182280
COUNTER=$1 # 1st argument = number to be stamped upon .jpg file
PATH_FILE=$2 # 2nd argument = /path_to_file/Filename.jpg
convert $PATH_FILE -auto-orient -gravity northWest -font "Arial-Bold-Italic" -pointsize 175 \
-fill red -annotate +30+30 "$COUNTER" $PATH_FILE;
((COUNTER++)) #https://stackoverflow.com/a/21035146/4953146
echo "watermarked i= $COUNTER $PATH_FILE"
目标是用唯一编号标记目录树中的所有 .jpg 文件。我相信每次调用 $COUNTER 时都必须增加它:这确保每个文件都带有唯一的编号。该策略是遍历所有子目录find
以识别 .jpg 文件,并使用 $COUNTER++ 对每个 .jpg 文件进行 BatesStamp。
此脚本goBatesStamp.sh
遍历子目录以执行每个要由BatesStamp处理的 .jpg 文件
# goBastesStamp.sh
cd /Users/user/Desktop/AITH_USB_Hope_Submitted_MyCloud/PhotoGraphs_Work/A_Building_NoBulkhead. # navigate to top level directory
COUNTER=100 # initialize COUNTER
find /Users/user/Desktop/AITH_USB_Hope_Submitted_MyCloud/PhotoGraphs_Work/A_Building_NoBulkhead -iname "*.jpg" -exec ./BatesStamp $((COUNTER+=1)) {} \;
问题在于以命令开头的行find
。具体来说, COUNTER 不会增加。
测试表明 .jpg 文件标有数字 100 它表明 $((COUNTER++)) 是问题所在。将 COUNTER 递增 1 并将递增的 COUNTER 输入 ./BatesStamp 的正确语法是什么?
在里面
shell 代码,
$((COUNTER+=1))
在调用命令之前由解释该命令行的 shell 扩展find
,因此find
被调用为:对于它找到的每个文件,它都会调用
./BateStamp 101 path/to/the/file
.即使您将其更改为:
for
find
启动一个增加自己的$COUNTER
变量并在一个循环中处理多个文件的 shell,它仍然无法正常工作,因为find
with-exec cmd {} +
可能仍然会调用cmd
多次,每次都有一批文件,并且sh
上面的每次调用都会再次从 100 开始。在这里,您需要一次调用 sh 或其他某种 shell 或编程语言,以便在一次调用中处理所有文件。
由于您已经在使用
zsh
,您应该能够:此处使用
zsh
递归 glob(**/
匹配 0 级或更多级别的子目录)而不是find
查找jpg
文件(仅限于具有.
glob 限定符的常规文件,并使用 ¹ 对输入列表进行数字排序,n
而不是像那样按随机顺序处理它们find
)并mogrify
改用因为convert
这是 ImageMagick 命令来就地编辑图像。请注意,对于要由解释器解释而不是
sh
直接执行的脚本,您需要一个 she-bang 行 (#! /path/to/the/interpreter
) 来告诉系统使用哪个解释器来解释文件的内容。或者您可以在 file: 上手动调用解释器zsh /path/to/that/file
,或者让您当前使用的交互式 shell(如果 zsh)直接使用source /path/to/that/file
或在子 shell 中解释它,这样它就不会使用(source /path/to/that/file)
.¹ 如果没有
n
(numericglobsort
也可以全局启用的选项)glob 限定符,排序是词法的,因此image2.jpg
例如会在排序之后,image10.jpg
因为在排序规则2
之后。1
² 如果您想知道shebang
-
中的额外内容,请参阅为什么“#!/bin/sh -”shebang 中的“-”?#! /bin/zsh -