You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:19:08