我想通过 globbing 在 zsh 中指定具有两个整数(例如 2 到 57)的文件范围(按字典顺序)。
例如:“在匹配某些通配模式的路径下按字典顺序选择文件 2 到 57”。
我认为使用方括号就可以了
for x in /foo/bar/*[2-57]; do print $x; done
但 zsh 显然认为我要求的是文件2
to 5
(或类似的东西)而不是文件2
to 57
。有什么想法吗?我怎样才能做到这一点?
答案1
[2-57]
2
是由 zsh 中的,3
, 4
,5
和7
, 以及所有其他通配符和正则表达式语法组成的字符集。您的全局模式*[2-57]
匹配最后一个字符是这五个数字之一的每个文件名。
我认为你记错了语法[m,n]
全局限定符。全局限定符始终放在模式末尾的括号中,范围分隔符是逗号。该模式*([2,57])
扩展到第 2、第 3、…、第 57 场比赛。默认扩展顺序是字典顺序(如果numeric_glob_sort
设置了该选项,则使用一些特殊的魔法按数字顺序对数字进行排序);您可以使用o
或O
glob 限定符来控制它(例如,*(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>
可能不会达到您的预期,因为*
也可能匹配数字。例如,file58
matches *<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 扩展,它们将按常见的数字结尾进行分组。