ZSH:排除指定隐藏目录的递归通配符

Ame*_*ina 8 zsh wildcards

我认为 glob 模式:

**/(*|.*)
Run Code Online (Sandbox Code Playgroud)

将代表以点 ( .)开头或不以点 ( )开头的每个文件夹和文件,但它会跳过当前目录中以..开头的目录。

什么是 glob 模式,这意味着:

每个文件和文件夹可能会或可能不会.在当前和更深的文件夹中开始

另外:如何从递归全局模式(例如上面的模式)中排除特定文件夹(或者甚至更好,全局子模式)?

我尝试了以下.hg从当前级别排除文件夹(但包括以.字符开头的其他文件夹):

**~.hg/*
Run Code Online (Sandbox Code Playgroud)

但它并没有递归地进入更深的目录。

Gil*_*il' 10

使 glob 模式匹配点文件的最简单方法是使用D glob 限定符

**/*(D)
Run Code Online (Sandbox Code Playgroud)

的优先级~低于/,因此**~.hg/***减去比赛.hg/*。但**只有在 a 之前才特殊/,所以这里它匹配当前目录中的文件。要排除.hg及其内容,您需要

**/*~.hg~.hg/*(D)
Run Code Online (Sandbox Code Playgroud)

注意 zsh 仍然会遍历.hg目录,这可能需要一些时间;这是一个限制**:您不能直接在此级别设置排除列表。


Sté*_*las 5

**/*(D)(简称(*/)#*(D))包括 dotfiles 和 dotdirs,如前所述。

如果要.hg在每个级别排除目录,您需要:

(^.hg/)#^.hg(D)
Run Code Online (Sandbox Code Playgroud)

(你需要setopt extendedglob^#运营商)

如前所述,~pattern将排除条目(基于在生成列表它们的完整扩展是否与“模式”匹配,因此不会阻止它下降到子目录中)。