我想创建一个简单的 bash 脚本来检查目录是否包含名称中包含从 1 到 N 的数字的所有文件。
# Creating some files for testing
$ cd /tmp/
$ mkdir test
$ touch test/a01x.dat
$ touch test/b02y.dat
# Display dir contents
$ ls test/*{01,02}*
test/a01x.dat test/b02y.dat
但是使用seq
命令生成数字会导致以下结果:
$ ls test/*{$(seq -s , -f "%02g" 1 2)}*
ls: cannot access 'test/*{01,02}*': No such file or directory
我知道通过用单引号将路径括起来来运行命令必须导致错误,因为通配符不会扩展
$ ls 'test/*{01,02}*'
但我没有使用它们。问题是什么?
问题是外壳会
{...,...}
在执行命令替换(部分)之前进行大括号扩展(处理)$(...)
。因此,在您seq
扩展之后,外壳将不会重新评估{01,02}
并将其保留为文字。您需要添加一个
eval
以使其在执行命令替换后重新评估表达式:在这种情况下,将首先执行命令替换,生成一个字符串
ls test/*{01,02}*
,然后eval
请求 shell 将其解释为命令,然后执行大括号和 glob 扩展,生成您期望的文件列表。