bash - 如何使 bash 扩展变量中的通配符?

标签 bash scripting expansion

我正在尝试实现与打字相同的效果

mv ./images/*.{pdf,eps,jpg,svg} ./images/junk/  

在命令行中,从 bash 脚本中。我有:

MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='{pdf,eps,jpg,svg}'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

它在运行时给出了意想不到的错误:

mv: rename ./images/*.{pdf,eps,jpg,svg} to ./images/junk/*.{pdf,eps,jpg,svg}: 
No such file or directory

引用所有这些内容的正确方法是什么,以便 mv 真正进行所需的扩展? (是的,有很多文件与 ./images/ 中的模式匹配。)

最佳答案

删除的答案是正确的。对您的尝试稍作修改:

shopt -s extglob
MYDIR="./images"
OTHERDIR="./images/junk"  
SUFFIXES='@(pdf|eps|jpg|svg)'
mv "$MYDIR/"*.$SUFFIXES "$OTHERDIR/"

大括号扩展在变量扩展之前完成,但变量扩展在路径名扩展之前完成。因此,当原始变量被扩展时,大括号仍然是大括号,但是当变量包含路径名元素时,它们在路径名扩展完成时已经被扩展。

关于bash - 如何使 bash 扩展变量中的通配符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4691956/

相关文章:

linux - bash 脚本在 jee 上调用时不起作用

bash - 如何在变量前后用通配符包围 find 的 -name 参数?

android - Flutter APK 大于 100 MB

xml - 创建 Bash 脚本以从 XML 文件检索数据

bash - 在文件名中使用计数变量

bash - 使用sed插入文件内容

linux - 不同的 shell 行为 : bash omits newline, zsh 保留它

windows - 在 Windows cmd 脚本中添加到 %TIME% 变量

linux - 如何生成一个新终端并使用 shell 脚本在其上运行一些命令?

bash - 循环时避免展开 : for x in $foo