Monday, February 19, 2007

学习unix和linux

最近一直在学习linux和unix方面的各种工具,这篇准备专门记录这方面的事情,算是流水帐吧!2月19号从这里学到几个工具:strace/ltrace/hexdump

tar
的-p开关,-C开关和-c以及-x开关
touch-t开关与find配合的妙用
xargsfind -exec的区别在于:前者知道其后的cmd最多可以带多少个参数,而后者一次只能一次操作一个参数,所以xargs可以有效降低命令执行的负载
xargsfind-exec选项的区别在于前者可以一次操作x个参数(-nx
处理带空格的文件名时,xargs会产生问题,因为其缺省分割符是空格,但gnu版本的-0选项与gnu版本find-print0选项配合,可以以'\0'为分隔符,我试验了一下,的确如此,使用xargs-d'\n'开关和find的-print 配合可以达到同样的目的;
xargs-i选项指定由find传递过来参数在命令中的位置(缺省是在最后),参数本身由{}指代;
find的要点:
find就是一个逻辑表达式(由无数与/或/非组成)无论是筛选文件的一系列条件(如-name,-user,-newer,-inum...)还是相应的动作(-exec,-print,-ls,-xdev...)都是逻辑表达式的一部分,find会把指定路径下的文件逐一交给这一逻辑表达式来校验,遵从短路原则:对操作,碰到第一个false就返回,否则继续校验;对操作,碰到第一个true就返回,否则继续校验;对find程序本身而言,它是不区分条件和动作的;

find的-prune参数:
这是比较浑人的一个知识点,主要有两点含义:
  1. 总是返回true(当-depth参数存在时,本参数失效)
  2. 如果满足条件的文件是目录时,作为一个副作用,find会跳过目录内的内容(即使把-prune取反,如”! -prune“,还是这样!
find . \! -type d -prune -o -ls这条命令的意图是列出当前目录下除目录外的所有类型,但实际输出为空,原因就是 "."也是个路径,由于prune的副作用,当前路径会被跳过,所以输出为空;
真正要达到愿意,需要这样:
find . -type d \! -name "." -prune -o -ls

-wholename参数不对"/"和"."作特殊处理,认为这是路径的自然组成部分,和-prune搭配,可以很好的忽略对一些目录层级内容(不包括这些目录本身)的处理!
例如:
find . -xdev -wholename "./download/*/pollini/*" -prune -o -ls |grep -i pollini
只会输出:
./download/Chopin/pollini
而该目录下的文件则被忽略,另外要指出,虽然中间的目录(Chopin)用*替代,但find还是顺利的找到,其实,目录层次再多点,全都用*替换,也没有问题!

0 comments: