迷途XO's Blog

confused coding

开始用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"。

  1. /:目录
  2. @:软链
  3. .:plain文件
  4. %:设备文件,其中%b是指定block设备,%c是char设备
  5. *:可执行文件(对本用户)
  6. 权限(就是mod)的过滤,具体有:sStxwrAIEXWR,f???
  7. ....

如果在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,一般用双引号包着就可以。