基本上我可以使用 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}"
)。