find是一个强大的文本搜索工具,有很多选型可以根据用户,时间,尺寸,路径,权限,文件类型等选项查找,也可以指定路径,最后还能对找到的文件进行处理 .

          下面主要介绍find的四个方面:

                    一:find与locate的比较

                    二:find的常见用法及其语法

                    三:find与xargs和exec的配置使用

                    四:find的实例


 一:find与locate

                       locate:依赖于updatedb库,是模糊匹配.查找速度块,非实时查找

                       find: 速度慢,精确查找

二:  find的语法

         find [options] [查找路径] [查找条件] [处理动作]

         查找路径:默认为当前路径

         查找条件:根据指定的选型不同而不同

         处理动作:默认为打印匹配的文件

          a.find的常见用法

                -user:根据用户查找,可以用来查找属于属主的文件

                -group:可以根据用户组来查找配置文件

                -perm:根据用户权限查找

                                 [+/-]MODE   MODE:用于精确查找

                                                         +MODE: 任一位任意权限满足需求

                                                         -MODE: 每类用户的权限都要匹配

                  -mtime:修改的时间          

                  -ctime:创建时间

                  -atime:访问时间            

                                                 时间参数:+n:表示n天之外

                                                                -n:表示n天之内

                                                                 n:表示大于等于n天小于等于n+1天

                   -size:根据文件大小查找

                        文件大小的参数

                                                +n(数字):大于n

                                                -n:(小于n)  

                                                           n(大于等于n-1小于等于n)

                   -type:根据文件类型查找

                   -name:根据文件名查找,支持通配符

                    path "目录" -prune -o -print :排除某个目录

                组合条件

                         -a :和    

                         -not:非

                          非A并且非B:非(A或B)  

                         非A或非B:非(A并B)  


      b.执行find后的默认动作:

                -print:打印标准输出到屏幕 ;

                 -ls: 以长格式显示查找结果

                 -exec COMMAND {} \; 将所有查找结果:

                 -ok COMMAND {} \;交互式的exec


:find的xargs与exec

        find与 exec,xargs配合会将文件的参数传递给后面可以执行命令


find与xargs

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现 溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。


find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。


在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;


而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。


实例


1、查找/var/目录属主为root且属组为mail的所有文件;

     属主:-user 并且:-a  属组:-group

            find /var -user -a -group mail

2、查找/usr目录下不属于root、bin或hadoop的所用文件;

       非A并且 非B=非(A或B)

     find /usr -not \(-user root -o -user bin -o -user haddop \)

3、查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件;

find /etc -mtime -7 -a -not \( -user root -o -user hadoop \)


4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;

                  #  没有属主:-nouser 没有属组:nogroup  一个月没有访问用atime  

                   find / \(-nouser -o nogroup\) -a -mtime -30

5、查找/etc/目录下大于1M且类型为普通文件的所有文件;

               # 尺寸:用size  并且用 -a  文件类似为普通文件:用type -f

              find /etc -size +1M -a -type f


6、查找/etc/目录所有用户都没有写权限的文件;

          #所有都没有用 -not 和-perm +MODE

find /etc/ -not -perm +222


7、查找/etc/目录下至少有一类用户没有写权限;

    #至少一类用户没有写权限,属于 非A,并且 非B: 非(A或B)

               find    /etc -not -perm -222


8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;

#根据用户的权限匹配,并且是精确匹配,因此需要用-MODE

find /etc/init.d/ -perm -113


9.备份所有系统的.conf结尾的配置文件.

  # 文件名匹配用-name ,备份得用-exec 配合cp来完成了

find / -name "*.conf" -exec cp {} {}.bak \

[root@localhost ~]# find / -name "*.conf" -exec cp {} {}.bak \;
[root@localhost ~]# find / -name "*.conf.bak"
/var/run/nm-dhclient-eth0.conf.bak
/etc/gnome-vfs-2.0/modules/ssl-modules.conf.bak
/etc/gnome-vfs-2.0/modules/default-modules.conf.bak
/etc/gnome-vfs-2.0/modules/smb-module.conf.bak
/etc/wpa_supplicant/wpa_supplicant.conf.bak
/etc/sos.conf.bak
/etc/ld.so.conf.d/kernel-2.6.32-431.el6.x86_64.conf.bak
/etc/ld.so.conf.d/mysql-x86_64.conf.bak
/etc/ld.so.conf.d/xulrunner-64.conf.bak
/etc/ld.so.conf.d/qt-x86_64.conf.bak
/etc/acpi/events/power.conf.bak
/etc/acpi/events/video.conf.bak