不*.{jpg,png}
应该选择任何这些类型的每个文件吗?
我知道mv
可以像这样连续接受目标mv *.png *.jpg folder/
,但为什么{}
这样不行呢?
答案1
您可能正在寻找
shopt -s nullglob
答案2
大括号扩展不是文件名通配符的一部分,它是一个独特的功能,并且在通配符发生之前起作用。
首先,大括号扩展*.{jpg,png}
变成*.jpg
和*.png
。然后,文件名通配将它们扩展为任何匹配的文件名。默认情况下,与任何文件都不匹配的 glob 模式将保持原样。所以,这两者是相等的:
mv *.png *.jpg folder/
mv *.{png,jpg} folder/
如果目录中存在的唯一文件是foo.png
和bar.png
,则这两个命令都会扩展为
mv foo.png bar.png *.jpg folder/
并且mv
可能会抱怨不存在的文件*.jpg
。
假设您使用的是 Bash,您应该使用 启用扩展 glob shopt -s extglob
,并使用扩展 glob *.(png|jpg)
。它会做你想要的,但实际上是一团,而不是两团。或者,您可以设置shopt -s nullglob
,这将使不匹配的 glob 消失而不是保持原样。
如果至少存在一个任一类型的文件,则两者的结果相同。如果根本不存在,*.(png|jpg)
则将保持原样,就像nullglob
禁用一样。打开nullglob
后,这些模式将完全消失,将命令变成只是mv folder/
。错误消息可能会令人困惑。