在开始解释find命令时,我们首先要明白一点:查找文件与文本过滤的区别

        文本过滤是指根据某个pattern,过滤出文本内容中符合pattern的内容并按用户指定的方式处理。

        查找文件是指根据某个pattern,查找出符合pattern的文件名。

根据下面的例子可以更好的理解查找文件与文本过滤的区别:

 
  
  1. # ls /var/log | grep ".*\.log" //显示文件名称本身的内容,首先会列举出 /var/log
  2. 目录下的所有文件的文件名,然后 在这些文件名中查找
  3. 符合以".log"结尾的文件名,即查找文件。

 

 
  
  1. grep “.*\.log” /var/log  //表示/var/log是一个普通文件,查找出符合pattern的
  2. 字符串的行,即用于文本过滤。 

 


 

用于查找文件的命令有locate和find:
 
locate:是用于模糊查找、非实时查找的,但是速度很快

     使用格式:
            locate KEYWORD
  
      locate是在数据库中查找的(类似于whatis),使用updatedb可以更新locate的数据库

 
  
  1. # locate passwd  //查找当前locate数据库中的文件名中包含passwd关键字的文件

 
 


 

find命令使用方法详解:
 

find命令功能:

      1、用于精确查找
      2、用于实时查找
      3、可以指定路径查找
      4、支持元字符通配
      5、递归查找


 
使用格式:

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


         注意:查找路径省略:表示查找的是当前路径
                     查找条件省略:表示将查找到的所有文件根据后面的处理动作处理
                     处理动作省略:表示显示出来

 
  
  1. # find     //后不接任何内容,表示将当前路径下的所有文件,以及子目录中的所有文件都
  2. 显示出来  

       
下面我们来详细介绍一下find命令的查找条件:


 根据文件名称查找:
 -name "FILENAME"
 -iname "FILENAME"  

 
  
  1. //查找/etc目录下以passwd为文件名的文件,从输出的结果中可以看到find命令可以递归查询  
  2. # find /etc -name "passwd"    
  3. /etc/pam.d/passwd  
  4. /etc/passwd  
  5.  
  6. //查找/etc目录下以"passwd*"、"*passwd*“为文件名的文件,这里使用到了glob通配  
  7. # find /etc -name "passwd*"  /etc/pam.d/passwd  
  8. /etc/passwd  
  9. /etc/passwd-  
  10. # find /etc -name "*passwd*"  
  11. /etc/security/opasswd  
  12. /etc/pam.d/passwd  
  13. /etc/passwd  
  14. /etc/passwd- 

  注意:
  (1)FILENAME要加引号(文件名可能会有空格),可以使用glob通配。
  (2)-name是区分文件名称大小写,要想不区分文件名称大小写,要使用-iname

 
  
  1. //查找/var/log目录下的含有"[a-z]*"的文件名,并且不区分大小写  
  2. # find /var/log -iname "[a-z]*" 


 
 根据正则表达式查找:
 -regex "PATTERN" 使用正则表达式通配
 -iregex "PATTERN" 使用正则表达式通配,而且不区分大小写


  
 根据文件的属主/UID、属组/GID查找: 
 -user USERNAME 查找是以USERNAME为属主的文件名
 -uid UID 查找uid=UID的文件名
 -group GROUPNAME 查找是以GROUPNAME为属组的文件名
 -gid GID 查找gid=GID的文件名

 
  
  1. //查找/tmp目录下以redhat为属主的文件  
  2. # find /tmp -user redhat  
  3. /tmp/test.txt  
  4. /tmp/redhat.txt 


        我们现在把redhat这个用户删除,那么再执行上面的命令就会出错,但是使用uid指定redhat用户的UID就不会出错,而且会精确查到该文件。

 
  
  1. # userdel redhat   //删除用户redhat
  2. # find /tmp -user redhat  //查找/tmp目录下以redhat为属主的文件
  3. find: invalid argument `redhat' to `-user'  
  4. # find /tmp -uid 501   //查找/tmp目录下uid=501的文件
  5. /tmp/test.txt  
  6. /tmp/redhat.txt 

 

 
 根据文件没有属主、属组查找:
 -nouser
 -nogroup

 
  
  1. //查找/tmp目录下没有属主的文件
  2. # find /tmp -nouser   
  3. /tmp/test.txt  
  4. /tmp/redhat.txt 

         对于这些文件,谁都可以看到、修改,所有当看到这些文件,我们应尽量给它属主、属组。


 
 根据文件的类型查找:
 -type 
        f    普通文件
       d    目录文件
        l    软连接文件
        b    块文件
        c    字符文件
        p   管道文件
        s   socket文件

 
  
  1. //查找/var/log目录下文件类型为目录的文件  
  2. # find /var/log -type d 

  
    
 根据文件的大小查找:
 -size [+/-]#
  单位常用的有k,M,G,不指定的话,默认是k。
  -size +number单位
  -size number单位
  -size -number单位

 
  
  1. //查找/etc目录下文件大小在大于1k小于2k的文件  
  2. #ls -lh `find /etc -size 2k`   
  3.  
  4. //查找/etc目录下文件大小为小于2k的文件  
  5. #ls -lh `find /etc -size -2k`    
  6.  
  7. //查找/etc目录下文件大小为大于2k的文件  
  8. #ls -lh `find /etc -size +2k`   


   
 根据时间查找:
 
 单位是day:
      -atime     访问时间
      -mtime    修改时间
      -ctime     改变时间
 
 单位是minute:
      -amin    访问时间
      -mmin    修改时间
      -cmin   改变时间

 
  
  1. //查找/tmp目录下在210min内被访问过的文件  
  2. #find /tmp -mmin -210   
  3.  
  4. //查找/tmp目录下在210min之前被访问过的文件  
  5. #find /tmp -mmin +210   
  6.  
  7. //查找/tmp目录下恰好在距现在210min时被访问过的文件  
  8. #find /tmp -mmin 210  

 
 
 根据权限查找:
 -perm
  mode 精确匹配
  /mode 任何一位匹配都行(即给定的某个文件的属主、属组、其他有一个权限匹配到就行)
  -mode 所有都得匹配(即给定的文件的权限大于等于给定的权限)

 
  
  1. //下面列举出了个文件的权限  
  2. # ll  
  3. total 24  
  4. -rw-r--r-- 1 root root 0 Jun 20 20:16 a  
  5. -rw-r----- 1 root root 0 Jun 20 20:16 b  
  6. -r--r--r-- 1 root root 0 Jun 20 20:16 c  
  7. -rw------- 1 root root 0 Jun 20 20:16 d  
  8. -r-------- 1 root root 0 Jun 20 20:16 e  
  9. -rw-rw-r-- 1 root root 0 Jun 20 20:16 f  
  10.  
  11. //查找当前目录下权限为640的文件  
  12. # find -perm 640  
  13. ./b  
  14.  
  15. //查找当前目录下属主权限为6,或属组权限为4,或其他用户的权限为0的文件  
  16. # find -perm /640  
  17. .  
  18. ./a  
  19. ./c  
  20. ./d  
  21. ./e  
  22. ./f  
  23. ./b  
  24.  
  25. //查找当前目录下权限大于或等于640的文件  
  26. # find -perm -640  
  27. .  
  28. ./a  
  29. ./f  
  30. ./b 

 

 
多条件查找:
    需要考虑条件间的逻辑关系:
         -a   并关系 (默认是表示并关系)
         -o   或关系
        !,-not   非关系

 
  
  1. //查找/etc目录下文件名称符合"*passwd*"并且属主是root的文件  
  2. #find /etc -name "*passwd*" -user root  
  3.  
  4. //查找/tmp目录下文件名称符合"*passwd*"或属主是root的文件  
  5. #find /tmp -name "*passwd*" -o -user redhat  
  6.  
  7. //查找/tmp目录下文件名称符合"*passwd*"或属主不是redhat的文件  
  8. //注意:-not的优先级最高  
  9. #find /tmp -name "*passwd*" -o -not -user redhat    
  10.  
  11. //查找/tmp目录下文件名称不符合"*passwd*"或属主不是root的文件  
  12. #find /tmp -not -name "*passwd*" -o -not -user redhat  
  13. #find /tmp -not \( -name "*passwd*" -a -user redhat \)    

 
 
处理动作:
     -print   默认
     -ls       详细显示
     -ok  COMMAND {} \;      执行命令前提醒用户确认
     -exec COMMAND {} \;    执行命令前不提醒用户确认
     find | xargs COMMAND    通过标准输入送过来执行命令行中的命令。
 

 
  
  1. //对查找到的当前目录下的权限大于等于400的文件执行 "chown redhat" 操作
  2. #find ./ -perm -400 -exec chown redhat {} \;  
  3.  
  4. //对查找到的当前系统下的没有属主且没有属组的文件执行 "chown redhat:redhat" 操作  
  5. #find / -nouser -a -nogroup -exec chown redhat:redhat {} \;  
  6.  
  7. //对查找到的当前目录下的权限大于等于002的文件执行重命名操作  
  8. #find ./ -perm -002 -exec mv {} {}.old \;  
  9.  
  10. //对/tmp目录下文件名称为core并且文件类型为普通文件的文件执行删除操作
  11. #find /tmp -name core -type f -print | xargs /bin/rm -f