星期一, 二月 05, 2007

几个 find 的参数测试

因为要结合 find 和 tar 来实现完全、差分和增量备份的方案,所以对 find 的情况必须深入了解。find 的 参数不是 GNU getopt 那种形式的,当组合使用的时候比较费解,有时候顺序的不同就可能得出完全不同的结果。例如:
sh# find . -type f \( -path ./docbook \) -prune -o -print | grep 'docbook'
./blfs-book-6.1-html/pst/docbook-utils.html
./blfs-book-6.1-html/pst/docbook-dsssl.html
./blfs-book-6.1-html/pst/docbook-xsl.html
./docbook
./docbook/index.xml
这里没有起到需要的效果,即排除 ./docbook 目录及其所有子文件。但如果使用:
sh# find . \( -path ./docbook \) -prune -o -print -type f | grep 'docbook'
./blfs-book-6.1-html/pst/docbook-utils.html
./blfs-book-6.1-html/pst/docbook-dsssl.html
./blfs-book-6.1-html/pst/docbook-xsl.html
则可以。这其实应该也是和 -o(OR) -a(AND) 运算的顺序一致的(-print -type f 相当于 -print -a -type f)。

再看对时间戳的操作:
sh# ls ts -l
-rw-r--r-- 1 root root 0 2007-01-01 00:00 ts
sh# ls blfs-book-6.1-html/pst/docbook-* -l
-rw-r--r-- 1 roc roc 11619 2005-08-21 05:14 blfs-book-6.1-html/pst/docbook-dsssl.html
-rw-r--r-- 1 roc roc 13821 2005-08-21 05:14 blfs-book-6.1-html/pst/docbook-utils.html
-rw-r--r-- 1 roc roc 11979 2005-08-21 05:14 blfs-book-6.1-html/pst/docbook-xsl.html
sh# find . \( -path ./docbook \) -prune -o -type f -print | grep 'docbook'
./blfs-book-6.1-html/pst/docbook-utils.html
./blfs-book-6.1-html/pst/docbook-dsssl.html
./blfs-book-6.1-html/pst/docbook-xsl.html
sh# find . \( -path ./docbook \) -prune -o -type f -print -cnewer ts | grep 'docbook'
./blfs-book-6.1-html/pst/docbook-utils.html
./blfs-book-6.1-html/pst/docbook-dsssl.html
./blfs-book-6.1-html/pst/docbook-xsl.html
sh# find . \( -path ./docbook \) -prune -o -cnewer ts -type f -print | grep 'docbook'
可以看到 -cnewer ts 的位置会有影响,如果放在最后就完全没有效果

没有评论: