find命令详解

 find:实时查找工具,通过遍历指定起始路径下文件系统层级结构完成文件查找。


                工作特性:查找速度略慢;精确查找;实时查找;(与locate命令相比较)

    用法find  [OPTIONS]  [查找起始路径]  [查找条件]  [处理动作]


 [查找起始路径]:指定具体搜索目标起始路径;默认为当前目录。

 [查找条件]:指定的查找标准,可以根据文件名、大小、类别、从属关系、权限等等标准进行;              默认为找出指定路径下的所有文件。

            [处理动作]:对符合查找条件的文件做出操作,例如删除等操作;默认为输出至标准输出。


[查找起始路径]:

                     指定要查找的起始路径,默认为当前用户所在目录(pwd命令查看用户当前所在目录)



[查找条件](选项)

      也可以称为 选项和测试(测试的结果通常为布尔型“true”,“false”)。

测试:

根据文件查找:支持glob风格的通配符,而不是正则表达式。

 -namepattern”:

                        例:查找/etc目录下查找名字是passwd的文件:

                                   ~]# find  /etc  -name  “passwd”   如图:

                              find命令详解_linux find命令 学习 linu

                  (此为精确匹配文件名)

 -inamepattern”:忽略大小写。


 -regex pattern(不常用):基于正则表达式模式查找文件,匹配是整个路径,而非其名。



 根据从属关系查找

 -user USERNAME:查找属主指定用户的所有文件。


                         例:查找/tmp目录下属主为root的所有文件;

                                    ~]# find/tmp -user root  如图:

                                find命令详解_linux find命令 学习 linu_02

                              (符合条件文件过多不再给出全部结果)


     -group GROUPNAME: 查找属组指定组的所有文件;


                          例:查找/tmp下属组为root的所有文件:

                                    ~]# find/tmp -group root  如图:

                                 find命令详解_linux find命令 学习 linu_03


     -uid UID:查找属主指定的UID的所有文件;


                          例:查找/tmpUID的所有文件

                                    ~]#find /tmp -uid 0 如图:

             find命令详解_linux find命令 学习 linu_04


     -gid GID:查找属组指定的GID的所有文件;


                          例:查找/tmpGID1001的所有文件

                                     ~]#find /tmp -gid 1001 如图:

                               find命令详解_linux find命令 学习 linu_05

       

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


                         例: 查找/tmp下没有属主的所有文件:

               ~]#find /tmp –nouser 如图:

             find命令详解_linux find命令 学习 linu_06    


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


                         例: 查找/tmp目录下没有属组的所有文件

               ~]# find /tmp -nogroup 如图:

             find命令详解_linux find命令 学习 linu_07


      

   根据文件类型查找:

      -type TYPEf:普通文件 d:目录文件 l:符号链接文件 b:块设备文件 c:字符设备文件                                       p:管道文件 s:套接字文件。


                          例:查找/tmp下所有的普通文件:

                                     ~]# find /tmp -type f -ls 如图:

                               find命令详解_linux find命令 学习 linu_08

            (注:其中-ls为处理动作,查看结果文件的详细属性信息,随后会提到) 

        

                    组合测试:

                与:-a,默认组合逻辑;(查找条件相互叠加在一起,与关系)

                或:-o  (多个查找关系之间是或的关系)

                非:-not,!(查找条件取反)


                           例:查找/tmp目录下属主为非root,而且文件名不包含fstab字符的文件:

     ~]# find /tmp -not -user root -a -not -name "*fstab*" 如图:

find命令详解_linux find命令 学习 linu_09


       根据文件的大小查找

      -size [+|-]#UNIT:常用单位:k, M, G

                                #UNIT(#-1, #]

                               -#UNIT[0,#-1]

                              +#UNIT(#, oo)

 

                        例:查找/tmp下文件大小大于1M的文件:

                                     ~]# find /tmp -size +1M

                                  find命令详解_linux find命令 学习 linu_10


 根据时间戳查找:

                    以“天”为单位:

-atime [+|-]#访问时间

                      #[#, #-1)

                     -#(#, 0]

                     +#(oo, #-1]

             -mtime修改时间

             -ctime改变时间

                    以“分钟”为单位:

-amin(访问时间) -mmin(修改时间)-cmin(改变时间)


                       例:查找/etc目录下七天内没有被访问过的文件:

  ~]# find /etc-atime +7   

                            查找/etc目录下一天内被修改过的文件:

                                    ~]# find/etc -mtime -1  如图:

                                 find命令详解_linux find命令 学习 linu_11  


  根据权限查找

            -perm  [/|-]mode


          mode:精确权限查找 

                      例:查找/etc目录下权限为640的所有文件:

             ~]#find /etc -perm 640 –ls 如图

                        find命令详解_linux find命令 学习 linu_12

                           (如图所示:采用精确查找的方式指定权限mode查找出来的文件的权限都为640

          

  /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足;9位权限之间存在“或”关系;

                     例: 查看/tzz目录至少有一类用户有写权限的所有文件:

                                  tzz]# find ./ -perm  /222 -ls 如图

                         find命令详解_linux find命令 学习 linu_13

   

-mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;9位权限之间存在“与”关系;

                     例:查看/tzz下每类用户都有写权限的文件:

                                  tzz]# find ./ -perm -222 -ls

   

     find命令详解_linux find命令 学习 linu_14

                              (注:和上一个命令做比较可以看出-mode/mode的区别)



[处理动作]

       -print:输出至标准输出;默认的动作;


-ls:类似于对查找到的文件执行“ls-l”命令,输出文件的详细信息;(上文演示过。)


-delete:删除查找到的文件;(危险操作)


-fls /PATH/TO/SOMEFILE:把查找到的所有文件的式信息保存至指定文件中;

           例:查找/tzz目录下三类用户都有写权限的所有文件并把找到的信息保存至/tzz/aaa文件中:

                           tzz]# find ./ -perm -222 -fls ./aaa   如图:

                 find命令详解_linux find命令 学习 linu_15


-ok COMMAND  {} \;   :对查找到的每个文件执行由COMMAND表示的命令;每次操作都由用户进行确认。


-exec COMMAND  {} \;  :对查找到的每个文件执行由COMMAND表示的命令;但不再由用户确认,注意和-ok的区别。

          例:找出/tzz下其他用户有写权限的文件并改为没有写权限。

                         tzz]# find ./ -perm -002 -exec chmod o-w {} \;   如图:

       find命令详解_linux find命令 学习 linu_16

                       如果此处为-ok执行动作会出现如图所示:

      find命令详解_linux find命令 学习 linu_17  

        每一步操作系统都会询问你是否执行此操作。键入y执行,n不执行。


注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:find | xargs COMMAND