我想澄清一下为什么您的脚本没有按预期工作,并添加另一种可能性以防万一。
您为什么会看到这些错误?
这是制作for 循环的一般方法:
for name [ [ in [ word ... ] ] ; ] do list ; done
在您的代码中,word 是 *.{png,PNG,jpg,JPG,jpeg,JPEG,bmp,BMP},假设您只有 .png 文件,它的扩展如下:
-
Brace Expansion:
*.png *.PNG *.jpg *.JPG *.jpeg *.JPEG *.bmp *.BMP
-
Filename Expansion:
file1.png file2.png *.PNG *.jpg *.JPG *.jpeg *.JPEG *.bmp *.BMP
-
示例:
$ ls
file1.png file2.png
$ echo *.{png,PNG,jpg,JPG,jpeg,JPEG,bmp,BMP}
file1.png file2.png *.PNG *.jpg *.JPG *.jpeg *.JPEG *.bmp *.BMP
在这一步,这些是您将一一分配给变量 name 的字符串。
例如:$name -> *.JPG
作为第一个建议,您可以使用nocaseglob:
如果设置,Bash 在执行文件名扩展时以不区分大小写的方式匹配文件名。
使用此选项,您可以将word 减少到*.{png,jpg,jpeg,bmp}
-
示例:
$ shopt -s nocaseglob
$ echo *.{png,jpg,jpeg,bmp}
file1.png file2.png *.jpg *.jpeg *.bmp
甚至*.{PNG,jpg,jpeg,bmp}
$ echo *.{PNG,jpg,jpeg,bmp}
file1.png file2.png *.jpg *.jpeg *.bmp
最后,正如@Etan 建议的那样,您可以使用nullglob 选项:
如果设置,Bash 允许不匹配文件的文件名模式扩展为空字符串,而不是它们本身。
在这种情况下,作为nullglob 的替代方案,您可以使用extglob 选项(有时默认启用):
如果设置,则启用扩展模式匹配功能。
这些是extended pattern matching features:
?(pattern-list)
Matches zero or one occurrence of the given patterns.
*(pattern-list)
Matches zero or more occurrences of the given patterns.
+(pattern-list)
Matches one or more occurrences of the given patterns.
@(pattern-list)
Matches one of the given patterns.
!(pattern-list)
Matches anything except one of the given patterns.
所以你可以把word写成*.*(png|jpg|jpeg|bmp):
这样,在Filename Expansion这一步就全部展开了。