开始用zsh(1):globbing
一直不清楚blog的定位是什么,姑且先作为知识的整理和分享好了。
zsh的交互式实在太诱人,反正还没有熟悉bash,还是直接上手zsh好了。切换shell可以直接用chsh -s /bin/zsh
globbing
也就是利用*之类的字符生成多个文件名,除了bsah的模式之外还有一个扩充模式。然后python中也有对应的模块,不知道有什么不同的地方。
基本的模式都很熟悉了:
*.c *.[co] *.[^ch] foo[1-9][0-9]?? mysrc.{c,h} mv {old,new}.c
在默认设置下,zsh可以在在globbing后面加入qualifiers,比如说:
ls -d *(.)
表示只生成plain文件的文件名,其中最后的()里面的是zsh的qualifiers,如果是(@)的话就表示只生成软链文件。下面列举出一些qualifiers,更具体的qualifiers可以参见"man zshexpn"。
- /:目录
- @:软链
- .:plain文件
- %:设备文件,其中%b是指定block设备,%c是char设备
- *:可执行文件(对本用户)
- 权限(就是mod)的过滤,具体有:sStxwrAIEXWR,f???
- ....
如果在qualifiers前面加上^就是相反的意思。
感觉就是,熟悉了qualifiers后find好像可以退休了,不过很多qualifiers都用不着就是了,需要的时候再查查zshexpn的manpage就可以了。
此外zsh还有一个扩展模式,则需要设置EXTENDEDGLOB变量:
setopt extendedglob
下面列出扩展模式的特性:
1. nagative pattern: "^" 和 "~"
在pattern前加上^,就^表示只生成pattern中^后面不符合的文件名。如:
ls -d *.^c
表示只生成后缀不为c的文件名。
在第一个pattern后面加上~和另外一个pattern,表示生成符合第一个pattern不符合第二个pattern的文件名:
ls pattern1~pattern2
2.数字范围
看看example就好:
% ls run<200-300> run234 run240 % ls run<300-400> run303 % ls run<-200> run123 run2 % ls run<300-> run303 % ls run<> run123 run2 run234 run240 run303
3.分组:
% ls (foo|bar).* bar.o foo.c foo.o % ls *.(c|o|pro) bar.o file.pro foo.c foo.o main.o q.c
4.递归搜索子文件夹 **/
ls /path/to/somewhere/**/*.h
几个问题:
1. 扩充失败时会见到:
zsh: no match found: pattern
也就是说找不到适合pattern的文件了。
2. 如果要匹配文件名中的特殊字符,记录要quote,一般用双引号包着就可以。