find命令详解

一 、 find基本概述

      有时可能需要在系统中查找具有某一特征的文件(例如文件权限、文件属主、文件长度、文件类型等等)。这样做可能有很多原因。可能出于安全性的考虑,或是一般性的系统管理任务,或许只是为了找出一个不知保存在什么地方的文件。find则是一个非常有效的工具,它可以遍历当前目录甚至于整个文件系统来查找某些文件或目录。


二、find与locate的区别

       locate:

             优点:查找速度快

             缺点:依赖于数据库,非实时查找,结果非精确,模糊查找

        find:

             优点:精确匹配,实时查找

             缺点:查询速度较慢


三、find的命令格式

1、find命令的一般形式为;

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

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

                        查找条件:默认为查找指定路径下所有文件    

                        处理动作:默认为显示


2、find命令的参数;

             2.1 查找条件的 一般命令:  

                             -name “文件名称”:支持使用文件名通配            

                             -iname "文件名称":查找不区分字符大小写          

                            -user UserName: 根据属主查找          

                             -group GroupName: 根据属组查找          

                             -uid UID :    根据uid查找        

                             -gid GID:根据gid查找          

                              -nouser:查找没有属主的文件        

                              -nogroup:查找没有属组的文件          

                               -type:根据文件类型查找                

                                          f:普通文件    

                                          d:目录    

                                          b:块设备    

                                          c:字符设备              

                                           l:符号链接文件                

                                           p:命名管道                

                                          s:套接字            

                                - size:根据文件大小查找                

                                         用法:  -size [+|-]#Unit                  

                                         例如:-size +2M    常用单位:K,M,G      


                根据时间撮查找   以天为单位(time):                    

                      用法: -atime [+|-]#                  

                             +:表示(#+1)天之外被访问过                

                             -:表示#天之内被访问过                    

                          无符号:表示短于(#+1>x>=#天的时间段被访问过


               根据权限查找:                    

                -perm [+|-] MODE                      

                 MODE:精确匹配                    

                +MODE:任何一类用户的任何一位权限匹配:常用于查找某类用户的某特定权限是否存在;

                -MODE:每类用户的指定要检查的权限位都匹配


            组合条件:                

                   -a:与,同时满足              

                   -o:或              

                   -not,!:   非,取反              

                   “非A  并且 非B” =  "非(A或B)  "

                   -not a -a  -not -b    =     -not  \(a -o b\)      


          2.2  处理动作的命令  

                   -print:默认选项,可以省略。表示打印在标准输出上

                   -ls:以长格式显示查找到的各位文件的信息

                    -exec COMMAND {} \;:对查找到的文件执行指定的命令

                    -ok COMMAND {} \;:在交互的模式下对查找到的文件执行指定的命令


四、find的用法实例

1、查找/var/目录属主为root且属组为mail的所有文件;
# find /var/ -user root -a -group mail
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
2、查找/usr目录下不属于root、bin或hadoop的所用文件;
# find /usr/ -not -user root -a -not -user bin -a -not -user hadoop
# find /usr/ -not \( -user root -o -user bin -o -user hadoop \)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
3、查找/etc/目录下最近一周内其内容修改过的,且不属于root或hadoop的文件;
# find /etc/ -mtime -7 -a -not -user root -a -not -user hadoop
# find /etc/ -mtime -7 -a -not \( -user root -o -user hadoop \)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
4、查找当前系统上没有属主或属组,且最近1个月内曾被访问过的文件;
# find / \( -nouser -o -nogroup \) -a -atime -30
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
5、查找/etc/目录下大于1M且类型为普通文件的所有文件;
# find /etc/ -size +1M -a -type f
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
6、查找/etc/目录所有用户都没有写权限的文件;
# find /etc/ -not -perm +222
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
7、查找/etc/目录下至少有一类用户没有写权限;
# find  /etc/ -not -perm -222
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
8、查找/etc/init.d/目录下,所有用户都有执行权限且其它用户有写权限的文件;
# find /etc/init.d/  -perm -113



五 、find与xargs

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

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

           在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。



你可能感兴趣的:(find)