如何编写Glob匹配模式匹配/routes目录下所有文件但排除/routes/locales子目录?
正确的Glob模式写法:匹配routes目录但排除locales子目录
嘿,我来帮你搞定这个Glob匹配的问题!你之前用的./app/routes/**[!_locales]之所以会误排除./app/routes/press/contact.tsx这类文件,是因为[!_locales]是字符集否定,它会排除任何路径段里包含_、l、o、c、a、e、s这些字符的内容,而不是排除整个locales目录——这就难怪合法的子目录文件被误删了。
下面是两种靠谱的解决方案,根据你使用的工具选择即可:
方案1:多模式组合(兼容性最好)
大部分支持Glob的工具(比如Gitignore、Vite、Webpack、Node.js的glob库)都支持用!前缀来排除路径。你可以先匹配所有routes下的文件,再排除locales子目录的内容:
./app/routes/**/* !./app/routes/locales/**/*
举个Node.js里的使用例子:
const glob = require('glob'); // 匹配所有routes文件,排除locales目录 glob('./app/routes/**/*', { ignore: './app/routes/locales/**/*' }, (err, matchedFiles) => { if (err) throw err; console.log('匹配到的文件:', matchedFiles); });
这种写法兼容性拉满,几乎所有支持Glob的场景都能生效。
方案2:单一扩展Glob模式(需要工具支持扩展语法)
如果你的工具支持扩展Glob语法(比如Bash的extglob选项、Node.jsglob库开启extglob: true),可以用单一模式实现:
./app/routes/!(locales)/**/*
这里的!(locales)表示“匹配任何不是locales的路径段”,然后/**/*递归匹配该路径下的所有文件。
比如在Bash里使用需要先开启扩展语法:
shopt -s extglob # 列出符合条件的文件 ls ./app/routes/!(locales)/**/*
不过要注意,不是所有工具都默认支持扩展Glob,所以如果不确定环境,优先选方案1更稳妥。
内容的提问来源于stack exchange,提问作者 coinhndp
相关产品推荐
相关产品推荐

