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处理,但不会继续进入其目录。
没有评论:
发表评论