我有一个包含编号数据文件的文件夹。我正在尝试逐步提取预定义范围的文件。我正在查找的文件范围是在两个变量 ns 和 ne 中预定义的,这两个变量随着代码运行而变化。
我一直在尝试类似以下的事情:
$ ns=0001
$ ne=0030
$ ls foo_{$ns..$ne}.nc
但这不会{$ns..$ne}
作为序列读取,并返回错误:
ls: cannot access foo_{0001..0030}.nc: No such file or directory
如果我键入相同的命令,但使用手动输入的数字,我将得到一个数字范围从 0001 到 0030 的文件列表(如预期)。
我认为我在使用测序时犯了一个基本错误,但希望有人告诉我这个错误是什么。
非常感谢。
答案1
大括号扩展发生在变量扩展之前,因此无法在其中使用变量。您可以使用seq
:
seq -f foo_%03.0f.nc $ns $ne
答案2
请注意,这{1..20}
不是通配符/通配符运算符。这是一种特殊形式的大括号扩展,由 和 引入zsh
并复制,但有限制和ksh93
变化bash
。
foo_{0001..0030}.nc
不会扩展到匹配文件列表,它会扩展到foo_0001.nc
, foo_0002.nc
, ...foo_0030.nc
无论文件是否存在。
bash
具有内容不能可变的限制。ksh93
并且zsh
没有这个限制。
所以ls -d foo_{$ns..$ne}.nc
将在这些 shell 中工作。
zsh
还有一个通配符/通配符运算符来匹配十进制数字范围。
ls -d foo_<1-30>.nc
将展开到匹配文件的列表。如果你想将其限制为 4 位 0 填充的数字,则需要另一个运算符:
ls -d foo_(<1-30>~^????).nc # needs extendedglob
(~
是除了(并不是),^
是不是,也是~^
如此且非非, 所以和)。
不过,该<x-y>
运算符不适用于变量(因为它与重定向运算符重叠,因此它仅在遵循模式时才起作用,<[digits]-[digits]>
以尽可能避免与重定向发生冲突)。但是,您可以使用此语法来解决它:
ls -d ${~:-foo_<$ns-$ne>.nc}
或者更清楚地说:
pattern="foo_<$ns-$ne>.nc"
ls -d $~pattern