- 如何查找一个匹配特定模式的文件名
for f in *.sh; do if echo $f | grep -q '^[a-zA-Z]+/.sh'; then echo $f fi done
这里我们在当前目录下,查找shell文件,并且,basename只包含ascii字符。这里"/."是必须的,否则就会匹配任意字符。
我们还以用bash的内建"[[...]]",这个运算符中支持正则表达,而且不会进行filename expansion和word splitting,但是会进行parameter expansion和command substitution。这样我们就可以直接编写正则表达式,而不用考虑用quoting。
for f in *.sh; do if [[ $f =~ ^[a-zA-Z]+/.sh ]]; then echo $f fi done
由于 [[ 是内建的操作符,所以速度比使用echo+grep的方法要快很多。
测试条件:当前目录下有17个shell scripts.
Method | Time(s) |
ehco + grep | 1.890 |
[[...]] | 0.111 |
使用内建的操作符,要快18倍。