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

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

我认为全局模式:

**/(*|.*)

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

glob 模式是什么意思:

.当前文件夹和更深层次文件夹中可能以或可能不开头的每个文件和文件夹

还:如何从递归 glob 模式(例如上面的模式)中排除特定文件夹(或者更好的是 glob 子模式)?

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

**~.hg/*

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

答案1

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

**/*(D)

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

**/*~.hg~.hg/*(D)

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

答案2

**/*(D)( 的缩写(*/)#*(D)) 包括 dotfiles 和 dotdirs,如上所述。

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

(^.hg/)#^.hg(D)

(您需要和运算setopt extendedglob符)^#

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

相关内容