find与xargs

1 find命令格式与基本参数
find命令基本格式为: find pathname -options [-print -exec -ok]
具体参数如下:
pathname:查找路径
-name:按照文档名称查找
-perm:按照文档权限查找
-prune:不在当前指定的路径查找。假如同时指定了-depth选项,则prune被忽略
-user:按照文档属主查找
-group:按照文档属组查找
-mtime -n +n:按照文档更改时间查找。-n 指距离现在时间n天以内;+n n天以外
-nogroup:查找无效属组文档
-nouser:查找无效属主文档
-newer file1 !file2:查找更改时间比file1新比file2旧的文档
-type:查找某一类型文档
b:块设备文档
d:目录
c:字符设备文档
P:管道文档
l:符号链接文档
f:普通文档
-size n[c]查找文档长度为n块的文档 有[c]表示文档长度以字节计
-depth:查找时,首先查找当前目录文档,然后再在其子目录查找
-fstype:查找位于某一类型文档系统中的文档,文档系统类型可在/etc/fstab中找到
-mount:查找文档不跨越文档系统mount点
-follow:如碰到链接文档,则跟踪至链接所指向文档
-cpio:对匹配的文档使用cpio命令,将文档备份到磁带设备中 
-print:将匹配的文档输出到标准输出
-exec:对匹配的文档执行所给的shell命令。形式为:command { } \;注意{ }和\;之间的空格
-ok:和-exec作用相同。只但是以一种更安全的模式执行该参数所给的shell命令。在执行每个命令之前,都会给出提示,让用户确定是否执行
以上命令参数不必要都掌握,只需掌握比较实用的,其他的用到时再查询也比较方便。
2 find命令实用场景举例
find / -name "[a-z]*" // 在根目录及其子目录下查找文件名以小写字母开头的文件,注意此处并不是正则表达式。
find ./ -user barry // 在当前目录下查找文件属主是barry的文件
find /barry -type d // 在barry目录下查找类型是目录的文件
find /barry -mtime +5 // 在barry目录下查找文件最后更新时间在5天以前的文件
find /barry -ctime -3 // 查找最后更新时间在3天以内的文件,注意此处是文件属性的更新时间,不是文件内容
find /barry -size +5k //查找文件大小在5k以上的文件
以上查找条件可以同时使用,用来查找同时满足多个条件的文件。
find ./ -type f -exec rm {} \; // 对于查找到的符合条件的文件执行rm命令,注意{}与\之间的空格
但是这样会有个问题,当查找到的文件非常多时,对每一个文件都执行rm命令,产生多个进程,资源消耗比较厉害。所以xargs就显得很聪明了,它并不产生多个进程。
3 xargs命令
xargs命令接收一块数据,这块数据是张参数列表,按照指定的分隔符,每个分段是一个参数。例如:
find ./ -type f | xargs rm
这样就对找到的每个文件执行rm命令,类似-exec的功能。
不过,问题来了,当find找到的文件的路径中有空格时,xargs会把这个路径分成两段,每一段作为一个参数,可见默认xargs是以空格问分割依据的。
如果让xargs和find命令以别的一个特殊的字符作为分隔符,这个问题不就解决了,这样xargs就不会误会find了。
find命令可以用 -print0选项将find命令的输出以空字符'0'作为分隔符,也就是说路径之间是以空字符作为分隔符的。
同理,xargs命令用 -0 来指定以空字符作为分隔符,从传递进来的数据中提取参数。如下:
find ./ -type f -print0 | xargs -0 rm
这样就和谐了。


原文

http://www.cnblogs.com/barrychiao/archive/2012/10/10/2718777.html