使用 find 命令时忽略 .svn 目录

服务器运行过程/开发过程中, 可能出现需要查找一下最近一天内发生变化的文件这样的需求.
于是我们只需要使用:

find . -type f -mtime -1 -exec ls -ld {} \;

这个时候, 我们用到的svn就跳出来作怪的, 大量的svn文件, 让你几乎无法判断数据(svn 1.7后应该是在一个项目下只有根目录才有svn目录了), 这时候我们相当的第一个方式就是过滤掉 .svn 输出, 然后得出如下:

find . -type f -mtime -1 -exec ls -ld {} \; | egrep -v '\.svn'

实际上, 上述的操作是在 find 的结果中进行过滤,如果文件过多, 操作过程是相当低效的, 那 find 有没有更高效的内置方法呢?答案是显然的, 而且有两种:
1. 匹配完整的文件名(! -iwholename ‘*.svn*’):

find . ! -iwholename '*.svn*' -type f -mtime -1 -exec ls -ld {} \;

2. 匹配路径(! -path ‘*/.svn/*’):

find . ! -path '*/.svn/*' -type f -mtime -1 -exec ls -ld {} \;

而上面指令中出现的 ! 其实是 -not 选项的一个缩写.