使用具有预定义范围的通配符序列列出编号文件

使用具有预定义范围的通配符序列列出编号文件

我有一个包含编号数据文件的文件夹。我正在尝试逐步提取预定义范围的文件。我正在查找的文件范围是在两个变量 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

相关内容