如何用Glob模式匹配assets目录下除i18n外的所有内容
关于Glob模式排除
i18n文件夹的问题 你用的dist/assets/!(i18n)/**模式兼容性有限,且存在遗漏场景,具体分析和可行方案如下:
原模式的问题
- 语法支持限制:
!(i18n)属于Glob扩展语法(extglob),不是所有工具都默认支持。比如Bash需要先执行shopt -s extglob开启扩展匹配,Node.js的glob库需要手动设置extglob: true选项,否则这个模式会被当作普通字符串解析,完全达不到排除效果。 - 遗漏根级文件:这个模式只匹配
dist/assets下非i18n子目录里的所有内容,如果dist/assets下存在直接的文件(不是在子目录中),这些文件会被漏掉。
可靠实现方案
方案1:通用排除法(推荐,兼容性最好)
大多数支持Glob的工具(包括webpack、rollup、Node.js glob、Git等)都支持排除模式,用「匹配全部+排除目标」的组合,无需依赖扩展语法:
- 主匹配模式:
dist/assets/**(匹配dist/assets下所有内容) - 排除模式:
!dist/assets/i18n/**(排除i18n文件夹及其所有子内容)
举几个场景的用法:
- Node.js glob库:
const glob = require('glob'); glob('dist/assets/**', { ignore: 'dist/assets/i18n/**' }, (err, files) => { // files会包含除i18n之外的所有内容 }); - Bash中用
find命令替代(无需依赖extglob):find dist/assets -path "*/i18n/*" -prune -o -print
方案2:启用扩展语法并修正模式
如果一定要用扩展语法,需要先确保工具支持,然后修正模式以覆盖根级文件:
- 修正后的模式:
dist/assets/!(i18n){,/**}!(i18n)匹配dist/assets下除i18n之外的直接子项(文件/目录){,/**}递归匹配子项的所有内容
比如在开启extglob的Bash中使用:
shopt -s extglob ls dist/assets/!(i18n){,/**}
内容的提问来源于stack exchange,提问作者Omar Dulaimi
相关产品推荐
相关产品推荐

