我几乎可以肯定这不是zsh
shell 提供的一种方式,但我想我还是会问一下,以确保我没有遗漏手册中的任何内容。
使用zsh
shell,我可以从具有模式的目录中挑选出两个最大的可见文件
*(.OL[1,2])
如果我有一组目录,并且我希望每个目录都有两个最大的文件,我相信我必须遍历各个目录然后使用
$dirpath/*(.OL[1,2])
(其中$dirpath
是当前循环迭代中的目录路径)。
很高兴能够说
*/*(.OL[1,2])
但是那个 glob 限定符将作为一个整体应用于匹配名称的列表,我会得到两个匹配项,而不是每个目录中的两个匹配项。
问题:是否可以将限定符的“范围”限制为仅以某种方式影响最近的路径组件?
你不需要循环。一个中间变量就足够了。使用
^
参数扩展符号分布在数组上。或者您可以使用匿名函数来避免临时变量(成为
$argv
匿名$@
函数参数):另一种方法可能是这样的:
可以
$reply
在 xpression glob 限定符中设置数组e
以进一步返回文件列表。因此,在这里,我们将目录或符号链接列表全局化到目录,并为每个目录返回 2 个最大的常规文件。请注意,
e
限定符语法是e:code:
,其中可以使用除:
定界符以外的其他字符,或者像e(code)
,之类的对e[code]
。但请注意,单词扩展是在code
部件中执行的,实际上是在 glob 限定符中的任何位置,这很好,因为您可以在其中使用变量 like*(L+$min_size)
,但这意味着您通常需要在code
内部加上单引号以防止扩展。现在,(这是我最近学到的一个技巧)如果
:
你使用一个恰好是通配符的字符(包括?
,*
但也包括[
,]
对)作为分隔符并将分隔符留在引号之外,那么你不要不必担心该字符是否会出现在代码中,因为未加引号的*
分隔符只能与另一个未加引号的分隔符匹配,与vs*
相同。[
]
*(N-/e['reply=($REPLY/*(N.OL[1,2]))'])
即使]
碰巧发生在由 unquoted 分隔的(带引号的)代码中,也可以工作[...]
。它不适用于其他分隔符,例如:...:
or(...)
或{...}
。