zsh 中按字典顺序排列的多位文件范围

zsh 中按字典顺序排列的多位文件范围

我想通过 globbing 在 zsh 中指定具有两个整数(例如 2 到 57)的文件范围(按字典顺序)。

例如:“在匹配某些通配模式的路径下按字典顺序选择文件 2 到 57”。

我认为使用方括号就可以了

 for x in /foo/bar/*[2-57]; do print $x; done

但 zsh 显然认为我要求的是文件2to 5(或类似的东西)而不是文件2to 57。有什么想法吗?我怎样才能做到这一点?

答案1

[2-57]2是由 zsh 中的,3​​ , 4,57, 以及所有其他通配符和正则表达式语法组成的字符集。您的全局模式*[2-57]匹配最后一个字符是这五个数字之一的每个文件名。

我认为你记错了语法[m,n] 全局限定符。全局限定符始终放在模式末尾的括号中,范围分隔符是逗号。该模式*([2,57])扩展到第 2、第 3、…、第 57 场比赛。默认扩展顺序是字典顺序(如果numeric_glob_sort设置了该选项,则使用一些特殊的魔法按数字顺序对数字进行排序);您可以使用oOglob 限定符来控制它(例如,*(om[2,57])匹配除第一个最新文件之外的 57 个最新文件)。

for x in /foo/bar/*([2,57]); do print $x; done

不是您所要求的,但与未来的读者相关并且可能有用:如果您想枚举文件 2 到 57 无论它们是否存在,您可以使用范围大括号表达式。 bash 和 ksh 中也存在此功能。

echo hello{2..57}

如果你想匹配名称中包含 2 到 57 之间的数字的文件,你可以使用模式<2-57>。这是 zsh 特有的。

$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57

请注意,类似的模式*<2-57>可能不会达到您的预期,因为*也可能匹配数字。例如,file58matches *<2-57>、 与file5匹配*部分 和8匹配<2-57>部分。该模式*[^0-9]<2-57>避免了这个问题。

答案2

但 zsh 显然认为我要求的是文件 2 到 5(或类似的文件)而不是文件 2 到 57。有什么想法吗?

因为[]括号表示匹配的列表人物(可以是数字),而不是数字从数学上解释。这种模式与单身的特点。该列表可以包含范围,但可以是数字或字母。[2-57]匹配扩展为“2 到 5 范围内的所有数字一个 7 英寸

要匹配 2 到 57 之间的数字,使用序列表达而不是通配模式(或与这样的模式一起):

for x in /foo/bar/*{2..57}; do print $x; done

编辑:但不幸的是,这不会为您提供所有列出文件的字典顺序 - 由于 shell 扩展,它们将按常见的数字结尾进行分组。

相关内容