find 是linux下强大的文件搜索工具
在说这个工具前先绍下另一个Linux下的查找工具
locate : 依赖于数据库(手动生成数据库updatedb,很耗时)
非实时查找,(因为是依赖于 数据库的,数据更新有一定的间隔时段,也可以手动更新)
查找速度快
模糊查找
find: 实时查找 、速度慢、能够精确匹配
find 使用格式
find [option] [查找路径] [查找条件] [处理动作]
[查找路径]:可以省略,默认为当前工作目录 [查找条件]:默认可以省略,默认为查找路径下的所有文件 [处理动作]:默认为显示到屏目
注意:查找的目录最好带上/结尾
查找条件:
-name 以文件名查找
-iname 以文件名查找不区分大小写
-user 以属主查找
-group 以属组查找
-uid 以文件的UID查找
-gid 以文件的GID查找
-nouser 查找不属于任何用户的文件
-nogroup 查找不属于任何属组的文件
-prem [+|-]MODE 按文件权限来查找
MODE:精确匹配 +MODE: 任何一类用户的任何一位权限匹配;常用于查找某类用户的某特定权限是否存在
+644 需要三个位都匹配,如444,644都会匹配到
-MODE: 每类用户的指定要检查的权限位都匹配;
-222 只要一个文件上任何位上有写权限都能匹配 如200,220等
-atime ,-mtime,-ctime ,[+|-] # 按时间戳来查找,以天为单位
+ #:表示#+1天之外的时间 - #:表示#天之内的时间 #:表示#天当天的时间
-amin,mmin,cmin [+|-] # 以分钟为单位
-type 按文件类弄查找
f 文件 d 目录 s 套接字 p 命名管道 l 链接文件 c 字符设备 b 块设备
-size [+|-] k ,M, G
+ #M:大于#M的文件 - #M:小于#M的文件,如果是1M,0.01到1M及1M以下的都会匹配到 # M:如果是2M,1-2M算匹配
组合条件:
-a: 与,同时满足
-o: 或,
-not, !:非,取反
-a 的优先级大于-o ; 有时需要用到括号需要反斜线转义写法:\( \)
处理动作:
-exec COMMAND {} \; 对查找到的文件执行命令操作。{}后有空格
-ok COMMAND {} \; 交互式-exec
-ls 以长格式列出,查找到的文件
-print 显示,默认为此动作
| xargs COMMAND 送给管道处理
find与xargs
如果find命令直接使用管道时,find将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。
这时我们需要用到 xargs命令
find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。
示例:
1、查找/var/目录属主为root且属组为mail的所有文件;
# find /var/ -user root -a -group mail # -a默认可以不写
2、查找/usr目录下不属于root、bin或hadoop的所用文件;
# find /usr/ -not -user root -not -user bin -not -user hadoop
3、查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件;
4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;
5、查找/etc/目录下大于1M且类型为普通文件的所有文件;
6、查找/etc/目录所有用户都没有写权限的文件;
# find /etc/ -not -perm +222
所有都没有:相反:任何一个有
所有都有:相反:至少有一个没有
7、查找/etc/目录下至少有一类用户没有写权限;
8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;