我想创建一个 glob 表达式来忽略dont_doc
目录中的任何文件,但是当我尝试使用 usingGLOBIGNORE
来执行此操作时,它不起作用:
$ GLOBIGNORE='**/dont_doc/**'
$ echo dont_doc/**
dont_doc/customBlockHelpers.hbs.js dont_doc/RoClasses.js dont_doc/RoEnums.js dont_doc/RoModules.js dont_doc/RoTypes.js
这就是我想要发生的事情:
dont_doc/doc.js #Fail
dont_doc/lol/doc.js #Fail
lol/dont_doc/doc.js #Fail
lol/dont_doc/lol/doc.js #Fail
lol.js #Succsed
index.html #Fail
oof/lol.js #Succsed
我该如何解决?
编辑:我也想忽略该node_modules
文件夹
答案1
尝试使用:
GLOBIGNORE='dont_doc:*/dont_doc:dont_doc/*:*/dont_doc/*'
请注意,它不会停止bash
查看这些目录,它只是从全局扩展中删除与这些模式匹配的条目。所以这里我们有 4 种以 分隔的模式:
,一种单独排除dont_doc
,一种排除以 结尾的模式/dont_doc
,一种排除以 开头的模式dont_doc/
,最后一种排除包含 的模式/dont_doc/
。
它类似于操作员在(如)~
中所做的事情zsh -o extendedglob
print -rC1 -- **/*~(|*/)dont_glob(/*|)
在 ksh93 中,您只需要FIGNORE=dont_doc
忽略dont_doc
目录条目即可。与zsh -o extendedglob
此类似(^dont_glob/)#^dont_glob
,但要注意,在 中ksh93
,设置FIGNORE
也会禁用隐藏以 . 开头的文件名.
。
请注意,仅当您启用启用 zsh 样式递归通配符的选项时,这才**
有意义。globstar
如果您在( )extglob
中打开该选项,则 ksh 的扩展 glob 运算符的子集将变得可用,并且您可以将该模式缩短为:bash
shopt -s extglob
GLOBIGNORE='?(*/)dont_glob?(/*)'
或者排除多个目录:
GLOBIGNORE='?(*/)@(dont_glob|node_modules)?(/*)'