如何在 zsh 中过滤 glob

如何在 zsh 中过滤 glob

基本上我可以使用 zsh 中的 glob 来创建列表。事实证明,我经常想过滤该列表,但我很奇怪地想知道我是否需要这样做。

zsh 有过滤列表的方法吗?我担心这是一个显而易见的问题,但从精神上来说,今天是低收益的一天。

答案1

这是一个奇怪的问题,因为 zsh 是唯一具有此功能的 shell。它被称为全局限定符。与往常一样,该手册相当简洁且缺乏示例。这Zsh 爱好者页面有一些示例。谷歌搜索zsh "glob qualifiers"出现一些博客文章和教程。您还可以搜索"glob qualifier"在这个网站上

基础知识:glob 限定符位于 glob 末尾的括号中。最有用的是标点符号,用于仅选择某些文件类型。

echo *(/)      # directories
echo *(.)      # regular files
echo *(@)      # symbolic links
echo *(-/)     # directories and symbolic links to directories

还有其他限定符可以过滤元数据,例如大小、日期和所有权。

# files owned by the user running zsh, over 1MB, last modified more than 7 days ago
echo *(ULm+1m+7)

Glob 限定符还可以控制匹配的顺序,并限制匹配的数量。

echo *(Om[1,10])     # The 10 oldest files

您可以通过使用限定符调用函数来设置任意过滤器(如果您不介意棘手的引用,+您甚至可以将代码与限定符内联)。e

请注意,不幸的是,所有这些都仅适用于全局。如果您想以这种方式构建文件名列表,则需要在通配时进行过滤。如果你想过滤你已经构建的列表,有一个完全不同的语法,参数扩展标志,只能进行简单的文本过滤("${(@)ARRAY:#PATTERN}")。

相关内容