我想创建一个简单的 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
Run Code Online (Sandbox Code Playgroud)
但是使用seq命令生成数字会导致以下结果:
$ ls test/*{$(seq -s , -f "%02g" 1 2)}*
ls: cannot access 'test/*{01,02}*': No such file or directory
Run Code Online (Sandbox Code Playgroud)
我知道通过用单引号将路径括起来来运行命令一定会导致错误,因为通配符不会扩展
$ ls 'test/*{01,02}*'
Run Code Online (Sandbox Code Playgroud)
但我没有使用它们。问题是什么?
fil*_*den 11
问题在于,shell 会{...,...}在执行命令替换($(...)部分)之前进行大括号扩展(处理)。因此,在seq展开之后,shell 不会重新评估{01,02}并将其保留为文字。
您需要添加一个eval以在执行命令替换后重新评估表达式:
$ eval "ls test/*{$(seq -s , -f "%02g" 1 2)}*"
Run Code Online (Sandbox Code Playgroud)
在这种情况下,将首先执行命令替换,生成一个字符串ls test/*{01,02}*,并且eval会要求 shell 将其解释为一个命令,然后执行大括号和 glob 扩展,从而生成您期望的文件列表。
| 归档时间: |
|
| 查看次数: |
745 次 |
| 最近记录: |