2008年12月20日星期六

Unix.Power.Tools:17. Finding Files with find

find . −name '*.o' −print 这边*.o用到通配符,所以要用 '' 括起来,否则shell会跑去解析它,而不能正常传给find了。

−atime +5 \( −name "*.o" −o −name "*.tmp" \) 指早于5天前访问过的、名称为"*.o"或".*.tmp"的文件。

−atime +5 −name "*.o" −o −name "*.tmp" 指 早于5天前访问过的、名称为"*.o"的文件 或 名称为".*.tmp"的文件。

find . −atime +5 \( −name "*.o" −o −name "*.tmp" \) −print

find . ! \( −atime +5 \( −name "*.o" −o −name "*.tmp" \) \) −print

在! , \( , \) , { } 前后都要有空格。

-o 是 或 ,-a 是 与 ,! 是 非 。

find . −newer /tmp/file1 ! −newer /tmp/file2 −print 打印出当前目录下所有新于/tmp/file1且旧于/tmp/file2的文件名。

find . −perm −20 −exec chmod g−w {} \;

find . −perm −20 −print | xargs chmod g−w

find是一次chmod g-w一个文件,而xargs是批量处理一些文件,xargs碰到包含空格的文件名时可能会有问题。

find . −inum 31246 −exec rm {} ';' 找到i-number为31246的文件,删之。

如果用-ok替换-exec,那么在对找到的每个文件执行指令前会要求输入y/n来进行确认最后是否真的执行。

也可以用管道传过去后一个个读:

$ find ... −print |
> while read file
> do mv "$file" "$file.orig"
> done

find . –name "*.o" –exec rm {} \; –print 这边-print是打印出找到的文件名,这样写就能看当前rm到哪个文件了。

find会读取它所搜寻目录下的所有inode信息,所以比较费时。当我们要在同一目录下对不同类型的多个文件做批处理的时候,可以把它们搞到同一个find命令里面运行,用or进行区分,减少处理的时间:

$ find . \( −type d       −a −exec chmod 771 {} \; \) −o \
         \( −name "*.BAK" −a −exec chmod 600 {} \; \) −o \
         \( −name "*.sh"  −a −exec chmod 755 {} \; \) −o \
         \( −name "*.txt" −a −exec chmod 644 {} \; \)

利用find拷贝目录树 find . −type d −print | sed 's@^@/usr/project/@' | xargs mkdir

find . −type d ! −name . −prune 只找出当前目录下的所有子目录,-prune的作用是,如果当前处理的对象是目录,则不会继续进这个目录进行处理。

-maxdepth可以指定进入的子目录深度,比如find . –maxdepth 0只处理当前目录,而不会进它的子目录。

-maxdepth一般放在其他参数之前。

find /path −exec test {} = /foo/bar −o {} = /foo/baz \; −prune −o pred 不对/foo/bar跟/foo/baz调用pred处理

find path \( −exec test test−exprs \; ! −prune \) −o pred 对符合test-exprs条件的目录调用pred处理,但不会继续进入其目录。

没有评论:

发表评论