说find之前我们先说两个概念:文件查找;文本过滤。这是两个不同的概念,所使用的命令也是不一样的。

    文件查找:查找目录中的文件

    文本过滤:查找文本中的行

    文本过滤的命令有:grep 、fgrep 、egrep 等 

         格式为:grep [选项]  [查找模式]  [文件名1,文件名2……]

   文件查找的命令有:find 、locate等

          格式为:find [查找目录]  [查找条件]  [动作]

现在大家对这两个命令有个大概的印象了吧,今天我们主要总结的是文件查找的命令,主要解析find。

   文件查找:

      locate :

       特点 :模糊查找   非实时查找 速度快   功能有限

        格式:#locate KEYWORD  直接跟文件名,也可以说是关键字。

        过程:在整个系统查找,但速度很快,因为虽在整个系统查找,但事实上是在datebase 数据库( #updatedb  创建 查找的数据库)上查找,也就是非实时查找。

      find:

      特点:精确,实时查找,而且可指定查找路径,速度慢

      格式为:find [查找目录]  [查找条件]  [动作]

 [查找目录]:可以省略,省略表示当前目录及当前目录下的所有子目录。

         [查找条件]:也可以省略,表示指定目录及子目录下的所有文件

         [动作]:也可以省略,表示print,显示出来。

    [查找目录]:

              直接指定目录就可以,例如:/etc

    [查找条件]: 

  1.  -name “FILENAME”   根据文件名查找 精确查找 区分大小写  
  2.  -iname "FILENAME" 不区分大小写   
  3.  
  4.  -regex "PATTERN"正则表达式  
  5.  -iregex "PATTERN" 不区分大小写 
  6.  
  7. -user USERNAME   查找属于某个用户的 
  8.  -group GROUPNAME 根据属组 查找
  9.   
  10.  -uid UID  
  11.  -gid  GID   把用户删除之后 用户原来创建的文件的属主 为原来用户的UID 
  12.  
  13.  -nouser  没有属主的文件 应该经常查找这类文件 给他一个属主  
  14.  -nogroup 没有属组的文件
  15.  
  16.  -type   (f,d,l,b,c,p,s) 
  17.  
  18.  -size [+/-] # {k|M|G} 默认单位是字节 byte 
  19.        -size +2M  找大于2M的文件 
  20.        -size -2M  找小于2M的文件  
  21.        -size 2M  (大于1k到两k的都显示 )     
  22.    ls -l ` find /etc  -size 2k `  命令引用  不可以通过管道 
  23.  
  24. 单位是day          
  25. -atime [+/-]#  访问过的文件  
  26. -mtime    修改的文件 
  27. -ctime    改变  
  28.      -atime +3  三天前访问的 
  29.      -atime -3  最近三天访问的 
  30.   -atime 3 往前数第三天访问过的文件
  31.  单位是 minute 
  32. -amin [+/-]# 
  33. -mmin [+/-]# 
  34. -cmin [+/-]# 
  35.  
  36. -perm  根据权限来查找  
  37.        mode   640 精确查找  
  38.        /mode /640   任何一位匹配都可以 /440 只要属主或属组有读权限的都可以满足。 
  39.  
  40.        -mode   -640 所有都带匹配 666也可以匹配 是包含的关系  
  41.               -440只要属主属组都有读权限 其他都不管                    
  42. -expty  -expty  寻找文件大小为0 Byte的文件,或目录下没有任何子目      录或文件的空目录。 
  43.  -fls <列表文件> 此参数的效果和指定的“ls”参数类似,但会把结果保存为指定的列表文件  

查找条件也支持多条件查找,条件间的逻辑关系 :

 并: -a  默认没写 就是并关系。

 或: -o

 非:-not ,!

 

 

[动作]:     

  1.  -print 默认是显示  
  2. -ls 显示详细信息  
  3.      
  4. -ok COMMAND {} \;        固定格式  提醒用户确认 
  5. -exec COMMAND {} \; 同上   直接执行命令   {} 表示占位符
  6. xargs COMMAND 功能更强大 不需要占位符  
  7. #find | xargs COMMAND  find查找到的结果通过管道送过来

example:

       下面通过一些例子,讲解每一个选项怎么用,可以达到什么效果。

查找/tmp目录下文件名为“passwd”或者属主是“root”的文件

    #find  /tmp  -name "passwd" -o  -user root  或关系

查找/tmp目录下文件名为“passwd”并且属主是“root”的文件

    #find  /tmp  -name "passwd" -a -user root  并关系

查找/tmp目录下文件名不是“passwd”或者属主不是“root”的文件

    #find  /tmp  -not -name "passwd" -o -not -user root

    #find  /tmp  -not \(-name "passwd" -a -user root \)

两种写法都可以达到目的。

小插曲 :摩根定律,感兴趣的朋友可以自己查看。有助于我们理解

 !a  ∪  !b  =! (a  ∩  b)

 !a  ∩  !b = ! (a  ∪  b)

查找当前目录下没有属主和属组的文件,并把属主属组改为root

     #find ./ -nouser -a -nogroup -exec chown root:root {}\;

查找当前目录下其他用户有写权限的文件,把文件名后面加上.old

      #find ./ -perm -002 -exec mv {} {}.old \; {}表示占位符 前面找到谁 就把{}替换成谁

查找/tmp目录下 属主是root,文件类型视普通文件的文件,先显示再删除

       #find /tmp -user root -type f -print (显示) | xargs rm -f  删除

下面有几道小练习题,大家可以看一下,用上面讲解的都可以完成,同时也可以检测一下我是否讲解清楚,让大家看明白了,有什么建议或意见直接留言。

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

2、查找/usr目录下不属于root,bin,或student的文件;

3、查找/etc目录下最近一周内内容修改过且不属于root及student用户的文件;

4、查找当前系统上没有属主或属组且最近1天内曾被访问过的文件,并将其属主属组均修改为root;

5、查找/etc目录下大于1M的文件,并将其文件名写入/tmp/etc.largefiles文件中;

6、查找/etc目录下所有用户都没有写权限的文件,显示出其详细信息;