一 Glob
① 初识
glob 最早是出现在'类Unix系统'的命令行中,是用来'匹配文件路径'的1)在最新的 CentOS 7 中已经'删除'了 glob 的相关描述文档2)删除的'原因'由于 glob 已经'整合'到了 shell 之中,然后就有了 'shell 通配符'常见: 涉及'glob'的相关命令 --> ls、touch、find、mv、vim、rm、tar等补充: 任何以'.开头命名的文件'都必须在glob中'显示指定'才能匹配案例: 比如有一个'隐藏'文件'.abc',那么rm *'匹配不到'.abc,只能使用rm .*glob与正则表达式不一样:1) glog只匹配'路径名',而'不是'匹配文件的'内容'2) 并且glob与正则表达式虽然有'部分相同的通配符',但是'意义'却不一样
② glob通配符讲解
1) *:匹配一个路径部分中'0个或多个'字符2) ?:匹配'一个'字符shell glob模式: '*' 可以匹配除了'/以外'的任何东西,"?" 可以匹配除了"/"以外的任意字符3)[]:匹配'字符集中的单个'字符 -->'[方括号]'注意1: 在[^…]和[!…]表示匹配'不在列表中'的字符,如[^abc]匹配除了a, b, c以外的字符注意2: 包含在[]中的字符'只会'被匹配一个,并且[]里面'不可以为空'注意3: []里面可以包含[,],!,?,*,\这些'特殊'字符,需要'转义'注意4: 可以使用横杠'-',例如:[a-z]需求: 如果要匹配'-',则可以把-放在'前面'或者'后面'比如: [-a0-9]匹配-,a,0到9中的'任意'字符如果要匹配!,则需要进行转义4) 补充: 上面所有通配符只匹配'单层'路径,不能跨目录匹配,即'无法匹配子目录'里面的文件--> 或者说'?或*'这样的通配符,'不能'匹配路'径分隔符(/)'5)**:代表'0或多个'层级的目录,匹配所有'文件、目录、子目录、子目录下的文件'案例: 比如'a/**/z' 可以匹配 'a/z'、 'a/b/z' 或 'a/b/c/z'等ls */*.txt --> 要'匹配子目录(一层)'里面的文件补充:bash version >= 4.0 shopt -s globstar确认globstar打开,否则'**'会被翻译成*使用重点: 不同语言的 glob 库支持的规则会'略有不同'
node-glob

特殊的'shell'通配符: 1) 使用'{花括号}'{a..c}、{a,b,c} --> '其他语言也可以使用' -->'brace'扩展案例1: ls {"au",[bc]}* --> 列出以 'au','b','c' 开头的文件案例2: ls init*[a-z] --> 列出所有文件中'以 init' 开头,'英文结尾'的文件2) ~'家目录'、 -'之前目录'3) POSIX风格 --> [::] '专用字符集' 和 [[::]] [:alnum:] --> 任意'数字'或者'字母'[:alpha:] --> 任意'字母'[:space:] --> '空格'[:lower:] --> '小写'字母[:digit:] --> 任意'数字' --> {0..9}[:upper:] --> 任意'大写'字母[:cntrl:] --> 控制符[:print:] --> 可'打印'字符[:punct:] --> 标点符号[:xdigit:] --> 十六进制数[:blank:] --> 空白字符案例: ls [[:lower:]]*[0-9]* --> 匹配以任意'小写字母开头','中间包含数字'的文件4) !:'排除'文件,如!a.js表示'排除文件a.js' -->'其他语言的glo也支持'5) \x:匹配字符x,用于'转义'符号细节: 通配符的过程中可能会遇到'文件名中'包含了'特殊(空格或*之类)'字符,用'单引号'包括

③ shell执行glob通配符的原理
1)通配符是'先解释','再执行'解读:bash 接收到命令以后,发现里面有通配符,会'先进行通配符扩展',然后再'执行命令'案例: ls w*.txtwzj.txt上面命令的'执行过程'是,bash 先将w*.txt扩展成wzj.txt,然后再执行ls ab.txt。2)通配符'不匹配',会'原样输出'bash 扩展通配符的时候,发现'不存在'匹配的文件,会将通配符'原样输出'
④ shopt各种glob模式
1) dotglob: bash在'文件名扩展'的结果中包括'以点(.)开头'的文件名2) extglob: 打开扩展的模式匹配特性,'正常的表达式元字符'来自Korn shell的文件名扩展[1]、shopt -u extglob --> '关闭'extglob shell选项[2]、shopt -s extglob --> '打开'extglob shell选项3) nocaseglob: 如果设置,当执行文件名扩展时,bash在'不区分大小写'的方式下匹配文件名4) nullglob: 如果设置,bash允许没有匹配任何文件的文件名模式'扩展成一个空串',而不是他们本身理解: GLOBIGNORE'变量'解读: GLOBIGNORE allows you to 'specify patterns' a glob 'should not match'
set -f:等同于set -o noglob ,表示'禁止'用路径名扩展,即'取消'通配符
⑤ extglob模式细讲


需求1: 删除目录下'除了filename之外'的所有文件rm -v !("filename")需求2: 删除除了'filename1和filename2之外'的所有文件rm -v !("filename1"|"filename2")需求3: 删除'除了.zip 之外'的所有文件rm -i !(*.zip)
⑥ IDEA .ignore插件
.ignore是IDEA的一款'专用忽略文件的插件',其支持的忽略文件类型'自己常用的'有:1).gitignore (Git)2).npmignore (NPM)3).dockerignore (Docker)4).chefignore (Chef)5).cvsignore (CVS)6).helmignore (Kubernetes Helm)说明: 不同的'语言'glob有一些差异性,本文主要讲解'unix的 glob'
⑦ .gitignore规则讲解
1) git 的 .gitignore 文件可以使用 'glob 模式'匹配2) 另外还有一些规则:[1]、所有'空行'或者以 '# 开头的行'都会被 git 忽略[2]、匹配模式可以'以 / '开头防止递归[3]、匹配模式可以'以 / 结尾'指定目录[4]、要'忽略指定模式以外'的文件或目录,可以在模式前加上'感叹号 !' 取反3) 需求需求1: 忽略'wzj'文件和目录,非递归wzj 需求2: 仅'忽略wzj文件',而'不忽略wzj目录',其中"感叹号!"表示反向操作!wzj/需求3: 仅'忽略wzj'目录下面的文件和文件夹,而'wzj文件'不会忽略wzj/需求4: 连续的'两个星号**'具有特殊的含义**/ 开头表示匹配所有目录;例如: "**/foo" 匹配'所有目录下'名称为foo的文件和文件夹**/foo/bar 匹配所有'foo文件夹下'名称为'bar'的'文件'和'文件夹'"/**" 结尾表示匹配在他下面的所有东西例如: "abc/**" 匹配所有在'abc文件夹'下的文件,abc路径是相对于.gitignore "/**/"匹配'零到多个'文件夹例如: "a/**/b"可以匹配'a/b', 'a/x/b', 'a/x/y/b'等等4) 补充*.a --> # 忽略所有的.a格式的文件/TODO --> # 只忽略当前文件夹下面的TODO文件,而'不会递归子文件夹'build/ --> #忽略所有build文件夹下面的文件和文件夹doc/*.txt --> #忽略doc文件夹下面的.txt文件,但是不会递归子文件夹下面的.txtdoc/**/*.pdf --> # 递归忽略doc文件夹下面的所有的.pdf文件5) 细节点(1)git '跟踪文件',而不是目录;(2)在 .gitignore 文件中,'每行表示一种模式'(3)如果本地仓库文件'已被跟踪',那么即使在 .gitignore 中设置了忽略,也不起作用。(4).gitignore 文件也会被上传的到远程仓库,同一个仓库的人可以'使用同一个'.gitignore 文件

















