我认为 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目录,这可能需要一些时间;这是一个限制**:您不能直接在此级别设置排除列表。
**/*(D)(简称(*/)#*(D))包括 dotfiles 和 dotdirs,如前所述。
如果要.hg在每个级别排除目录,您需要:
(^.hg/)#^.hg(D)
Run Code Online (Sandbox Code Playgroud)
(你需要setopt extendedglob的^和#运营商)
如前所述,~pattern将排除条目(基于在生成列表后它们的完整扩展是否与“模式”匹配,因此不会阻止它下降到子目录中)。