分类: LINUX
2011-11-10 23:48:48
vim有个非常有用的插件lookupfile。有了该插件,可以非常快捷,方便地定位到项目中的任何一个文件。该插件,可以通过tags文件来实现找到,但这样效率不高。在lookupfile的帮助中,提到了一种产生高效索引文件的方法:
(echo "!_TAG_FILE_SORTED 2 /2=foldcase/";
(find . \( -name .svn -o -wholename ./classes \) -prune -o -not -iregex '.*\.\(jar\|gif\|jpg\|class\|exe\|dll\|pdd\|sw[op]\|xls\|doc\|pdf\|zip\|tar\|ico\|ear\|war\|dat\).*' -type f -printf "%f\t%p\t1\n" | sort -f))
> ./filenametags
从上可以看出,该脚本主要是利用了find命令。乍看之下,非常复杂。对待复杂的东西,就好采用分治的方法。
首先要对find命令的结构要有个了解。
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
可以看出,find由3类参数组成。
一、5个“real options”:-H -L -P -D -O这5个参数有点特殊,必须在path前,因此跟后面表达式中的options有区别。
1)-H -L -P:这3个用于说明,怎么处理path中的symbolic links。-P默认选项,从不跟symbolic links;-L,follow symbolic links;-H,只跟命令行中的symbolic links。
2)-D:调试选项,find -D help来查看具体的调试选项
3)-O:优化级别[0-3],默认为1。通过reorder表达式,加快执行速度。
二、path(路径或文件名):描述搜索的位置,可以有多个。如何与表达式区分开来呢?如果以”-”,”(”,”!”开始,就进入到表达式部分了。
三、expression(表达式):描述搜索的样式。find最复杂的部分就是表达式,前面举的例子:除了find .之外,剩下的全是表达式。根据这例子,详细来介绍下表达式。
表达式基本组成元素:3+1
3代表:3类基本元素--普通选项,动作,测试。
1代表:操作符,将3类基本元素组合复杂的表达式。
根据前面举的例子,说说常用的表达式,具体的可看文章后面的附录或者查看find的手册。
选项:除了-daystart, -follow and -regextype,其它选项会影响所有的测试(即使测试先出现,因为选项在parse command line会同时被parse),返回都是真。例子中没有,常用的有:
-depth -maxdepth,-mindepth:指定搜索目录的深度
-regextype:指定RG流派--emacs (this is the default), posix-awk, posix-basic, posix-egrep and posix-extended
动作:常用到的有
-prune:如果是目录,返回true,但不搜寻该目录;如果指定了-depth,返回false,并不起作用
-printf format:返回true,按指定格式输出到标准输出上
-print:返回true,输出文件名到到标准输出,并跟着输出一个换行符(newline)。
-print0:同上,但是跟着输出的是终止符(null character)
测试:
-type c:文件类型--f regular file / d directory / p name pipe / s socket等等
-ipath/-iwholename/-path/-wholename:根据样式,匹配文件名。注意,样式不符合RG,更像通配符的方式,后面两个是大小写敏感,前两个不敏感。
-name/-iname:匹配base of file name,即不包括前面的路径,其它的同上一条。
-regex/-iregex:采用RG文法,匹配文件名
-atime n/-ctime n:在过去N天内,创建或访问的文件
-anewer file/-cnewer file/-newer file:比file更新的文件
附录:find表达式的基本组成部分
操作符
(优先级递减;未做任何指定时默认使用
-and):
( EXPR ) ! EXPR -not EXPR EXPR1
-a EXPR2 EXPR1 -and EXPR2
EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
普通选项
(总是真,for
clarity最好放在其它表达式前指定):
-depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
--version -xdev -ignore_readdir_race -noignore_readdir_race
动作:
-delete
-print0 -printf FORMAT -fprintf FILE FORMAT -print
-fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
-exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
-execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;
测试(N可以是
+N
或-N
或
N):-amin
N -anewer FILE -atime N -cmin
-cnewer 文件
-ctime
N -empty -false -fstype 类型
-gid
N -group 名称
-ilname 匹配模式
-iname
匹配模式
-inum
N -ipath 匹配模式
-iregex
匹配模式
-links N -lname 匹配模式
-mmin
N -mtime N -name 匹配模式
-newer
文件
-nouser -nogroup -path 匹配模式
-perm
[+-]访问模式
-regex
匹配模式
-readable -writable -executable
-wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid
N
-used N -user NAME -xtype
[bcdpfls]