如何用Glob表达式排除隐藏文件与测试文件?
Glob表达式排除特定文件问题解决
文件列表
./app/tags.ts ./app/tag.ts ./app/status.ts ./app/bar/{foo}/baz.ts ./app/.hidden.ts ./app/_hidden.ts ./app/foo_dir/.hidden.ts ./app/some/testing_should_be_hidden.test.ts
需求
排除以下三类文件:
- 文件名以
.开头的隐藏文件 - 文件名以
_开头的文件 - 文件名中包含
.test的测试文件
尝试过的表达式及问题
- 尝试表达式:
./**/[!._]*^(?!*test).{ts,js}
该表达式未生效,原因是^(?!*test)属于正则表达式的负前瞻语法,Glob不支持这种语法。
- 尝试表达式:
./**/[!._]*.{ts,js}
可以排除以.或_开头的文件,但无法排除包含.test的测试文件。
解决方案
方案1:多模式排除(推荐,兼容性好)
大多数支持Glob的工具(如node-glob、Vite、Webpack等)支持用!前缀指定排除规则,先匹配所有目标文件,再排除不符合要求的:
./**/*.{ts,js} !./**/.* !./**/_* !./**/*.test.{ts,js}
- 第一行:匹配所有目录下的
.ts/.js文件 - 第二行:排除所有以
.开头的文件 - 第三行:排除所有以
_开头的文件 - 第四行:排除所有以
.test.ts/.test.js结尾的测试文件
方案2:单模式匹配(需工具支持扩展Glob)
如果使用的工具支持扩展Glob语法(如bash的extglob、node-glob的extglob选项),可以用单个表达式实现:
./**/[!._]*!(*.test).{ts,js}
[!._]*:匹配文件名不以.或_开头的部分!(*.test):扩展Glob语法,匹配不包含.test的部分- 最终只会匹配符合要求的非隐藏、非测试文件
验证结果
用上述方案处理给定文件列表,会保留以下文件:
./app/tags.ts ./app/tag.ts ./app/status.ts ./app/bar/{foo}/baz.ts
其余文件均被正确排除。
内容的提问来源于stack exchange,提问作者M. Gara
相关产品推荐
相关产品推荐

