mv *.{jpg,png} 文件夹/仅在两种文件类型都存在时才有效

mv *.{jpg,png} 文件夹/仅在两种文件类型都存在时才有效

*.{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.pngbar.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/。错误消息可能会令人困惑。

相关内容