上下文:macOS Catalina (zsh)
此脚本用于处理所有 JPEG 文件。此脚本不处理 .JPG 文件,但它确实处理 .jpg 文件。
top=/Users/user/Desktop/
for file in $top/**/*.jp*g(NDn.); do #selects filetypes: .jpg .jpeg
mogrify -auto-orient \
-gravity northWest \
-font "Arial-Bold-Italic" \
-pointsize 175 \
-fill red \
-annotate +30+30 $n \
-- $file &&
echo $file "was watermarked with" $n | tee -a forLooplog.txt
(( n++ ))
done
如何将第二行修改为不区分大小写并捕获 .JPG .JPEG 文件?
特别是对于 glob 为 的情况
$top/**/*.jpg
,我不会全局关闭该caseglob
选项(与打开nocaseglob
¹相同),因为这会影响 glob 模式中的所有路径组件:看看它是如何找到 ( ) 中的所有文件的,
jpg
以及一个不相关目录 ( ) 中的文件,这些目录恰好具有相同的名称,但都是大写的。即使您没有这样的目录,zsh 仍会查找它们,这意味着它需要列出构成使 glob 扩展成本更高的组件的每个目录的内容。JPG
$top
a
A
$top
IMO,
nocaseglob
最好忘记该选项。它只是为了与bash
² 兼容而添加到 zsh 中,并且很可能是为了使具有不区分大小写的文件系统 API 的系统(如 Cygwin / macos)的用户的生活更轻松。相反,我使用了
(#i)
glob 运算符 (withextendedglob
),您可以在其中指定 glob 的哪个部分不区分大小写(类似于~(i)
ksh93 的):或者你总是可以这样做:
就像在
sh
没有不区分大小写的全局运算符的任何 shell 中一样。另请注意,
*.jp(|e)g
而不是*.jp*g
which 将匹配文件名,例如。my.jpeg.import.log
¹ 或
CASEGLOB
,CASE_GLOB
,C_A_se_G_lob
, 大小写和下划线在选项名称中被忽略,no
关闭选项的支持是尝试适应 POSIX sh 选项(以及其他 shell,包括 zsh 本身)的混乱,其中某些选项以 a 命名no
前缀和一些没有立即明显的原因。² 尽管在这种情况下 bash 行为不同(并且更可取的 IMO,至少在具有区分大小写文件名的系统上),但它只会在 中
a/*.jpg
找到jpg
/JPG
文件a
,而不是因为它只对具有 glob 运算符的路径组件A
进行不区分大小写的匹配(也会在 中找到/文件)。[a]/*.jpg
jpg
JPG
A