Skip to content

前言

开发中常用到各种通配符,目前通配符规范较多,有linux通配符,也有nodejs通配符。简单记录一下区别和各自的使用场景,

linux通配符

  • * 匹配零个或者多个字符,但是不匹配"."开头的文件, 也不会匹配/之外的内容(限制在单个路径)
  • ? 匹配任何单个字符
  • ~yang 用户杨根目录
  • [0-9] 匹配0-9 一次
  • [!0-9] 不匹配0-9一次

linux是先匹配再执行。比如touch *.txt。先匹配发现没有则不执行。

touch {1..9}.txt 先解开大括号创建1到9的txt

后来bash又在这个基础上扩展了几个语法

  • ** 跨目录匹配,也是先按照目录展开模式再匹配 ls /.* 和 ls **/. 有区别
  • {a,b,c} 重复执行匹配模式,先展开大括号再执行*等匹配
  • {a..c} 重复执行a到c之间的匹配模式
  • ?(parttern-list) 匹配一次括号里面的模式
  • *(parttern-list) 匹配0次或者多次
  • +(parttern-list) 匹配一次或者多次
  • @(parttern-list) 匹配一次
  • !(parttern-list) 不匹配

回到开头node中大部分都使用的是扩展后的语法,而且是自行实现,不和平台挂钩。但是我们在命令行中执行命令时根据使用shell的版本,有可能没有实现一些扩展语法

比如在rimraf中删除东西 rimraf **/node_modules 有可能就不会删除,因为没有实现** 语法。

还有一个坑是npm中执行脚本,npm执行脚本不一定会在当前的shell执行,有可能会在其他的shell。就会出现glob语法和在命令行执行不一致的情况,比如上面的rimraf。 大部分工具目前都是用的自定义的glob,通过将glob用引号包裹起来可以避免shell的glob模式

npm 中一定要用引号包裹