在系统维护工作时,经常会查找文本文件。

例如:假如:web服务器经常出现延迟,或者经常会出现一些参数的错误信息。

            1、考虑带宽问题

            2、考虑我的配置文件问题:

            例如:是不是被其它人更改过所造成的参数、延迟等信息,这样我们就会用到find命令来查找文件的相关信息,并加以修改。

            如果我们做系统运维这方面的工作时,会经常用到find命令来帮助我们完成文件的查找工作,所以我们要认真学习find命令的使用及其相关的高级用法:

 
  
  1. 文件查找:locate、find  

  2. locate:  

  3.    非实时,模糊匹配,查找是根据全系统文件数据库进行的;  

  4. # updatedb, 手动生成文件数据库  

  5. find:  

  6.    实时  

  7.    精确  

  8.    支持众多查找标准  

  9.    遍历指定目录中的所有文件完成查找,速度慢;  

  10. 查找路径:默认为当前目录  

  11. 查找标准:默认为指定路径下的所有文件  

  12. 处理运作:默认为显示  

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

  14. find 查找路径 查找标准 查找到以后的处理运作  

  15. find pathname -options [ -exec -ok ...]  

  16. 2、find命令的参数;  

  17. pathname:   find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。  

  18. -print:     find命令将匹配的文件输出到标准输出。  

  19. -exec:  find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {  } \;,注意{   }和\;之间的空格。  

  20. -ok:        和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。  

  21. 3、find命令选项  

  22. -name :按照文件名查找文件  

  23. For example:在/etc目录下查找文件名passwd的文件  

  24.        # find /etc -name'passwd'

  25. -iname:按照文件名查找文件,且不区分大小写  

  26. For example:在/etc目录下查找文件名passwd的文件  

  27.        # find /etc -iname 'passwd'

  28. -user:按照文件属主来查找文件  

  29. For example:在/tmp目录下查找属主为hdoop的文件或目录  

  30.        # find /etc -user hdoop  

  31. -group :按照文件所属的组来查找文件        

  32. For example:在/tmp目录下查找属组为hbase的文件或目录  

  33.        # find /tmp -group hbase  

  34. -uid:UID:当某个用户被删除,用户所属的文件UID没有被删除,在这个情况下就可以使用此选项  

  35. For example:用户hdoop的UID为600,如果将hdoop用户删除,那如何在/tmp查找文件或目录的属主为hdoop以前的文件呢  

  36.        # find /tmp -uid 600  

  37. -gid:GID:当某个组被删除,用户所属的文件GID没有被删除,在这个情况下就可以使用此选项  

  38. For example:组hbase的GIDD为666,如果将hbase组删除,那如何在/tmp查找文件或目录的属组为hbase以前的文件呢  

  39.        # find /tmp -gid 666  

  40. -nouser:查找没有有效所属主的文件,即该文件所属的主在/etc/passwd中不存在  

  41. For example:查找/tmp目录没有属主的文件  

  42.        # find /tmp -nouser  

  43. -nogrouop:查找没有有效所属组的文件,即该文件所属的组在/etc/groups中不存在。  

  44.        # find /tmp -nogroup  

  45. -type:以文件类型查找文件  

  46. 在Linux文件系统中常用到的文件类型有:  

  47.    b:块设备文件  

  48.    d:目录  

  49.    c:字符设备文件  

  50.    p:管道文件  

  51.    l:符号链接文件  

  52.    f:普通文件  

  53.    s:套接字设备文件  

  54.    p:管道设备文件  

  55. For example:查找/tmp目录下所有普通文件  

  56.        # find /tmp -type f  

  57. -size: [+|-]文件大小查找文件  

  58.    默认单位是字节,当我们去找10M的文件时,所有9点几兆的文件都满足条件。  

  59.    #k:(#代表数字)  

  60.    #M:(#代表数字)  

  61.    #G:(#代表数字)  

  62. For example:查找/tmp目录下文件大小为10MB的文件  

  63.        # find /tmp -size 10M  

  64. 组合条件:  

  65.    -a:与条件  

  66.    -o:或条件  

  67.    -not:非条件  

  68. For example:查找/tmp目录下没有属主并且类型为目录的文件  

  69.        # find /tmp -nouser -a -type d -ls  

  70.        假如把-a换成-o选项:则说明没有属主或是目录文件,两个选项满足一个即可。  

  71.        # find /tmp -not -type d  

  72.            说明在/tmp目录查找非目录类型的文件  

  73.        查找/tmp目录下,非目录类型,并且还不是套接字类型的文件  

  74.            # find /tmp -not -type d -a -not -type s  

  75.            # find /tmp -not \( -type -d -o -type -s \)  

  76.            两者都可以实现目的:  

  77. 根据时间戳查找符合的文件:  

  78.   -ctime [+/-]n:查找系统中最后n天被改变文件状态的文件(单位:天)  

  79.        +5:至少有五天没有访问过  

  80.        -5:五天内被访问过  

  81.        5:如果不加[+/-]:刚好五天被放过  

  82.    -atime [+/-]n:查找系统中最后n天被访问的文件(单位:天)  

  83.        同上解释:  

  84.    -mtime [+/-]n:查找系统中最后n天被修改的文件数据(单位:天)  

  85.    -cmin [+/-]n:查找系统中最后N分钟被改变文件状态的文件(单位:分钟)  

  86.        +8:至少8分钟没有改变过的文件  

  87.        -8:8分钟之内改变过的文件  

  88.        8 :正好8分钟改变的文件  

  89.    -amin [+/-]n:查找系统中最后N分钟访问的文件(单位:分钟)  

  90.        同上解释:  

  91.     -mmin [+/-]n:查找系统中最后N分钟被改变文件数据的文件(单位:分钟)  

  92.        同上解释:  

  93. -perm :根据文件权限来查找文件  

  94.    MODE:精确匹配  

  95.    /MODE:只要有一位权限匹配即可  

  96.    -MODE:文件权限完全包含此MODE时才给予显示  

  97. 动作:默认动作为print,表示显示出来  

  98.    -printe  

  99.    -ls:类此ls -l的形式显示出每个被匹配到的文件的详细信息  

  100.    -ok COMMOND {} \; 只不过每一步操作都需要用户确认是否操作  

  101.    -exec COMMOND {} \; 不需要用户确认信息  

  102.    当使用find命令的-exec选项处理匹配到的文件时,find命令将所有匹配到的文件一起传递给exec来执行。  

  103. For example:查找当前目录其它用户具有读执行的文件并且将其它用户写权限去掉,并显示匹配到的文件详细信息  

  104.        # find ./ -perm -006 -exec chmod o-w {} \; -ls  

  105.        # find ./ -perm -006 -ok chmod o-w {} \; -ls    

  106.        以上两个命令都可以实现此结果  

  107. For example:查找/tmp目下属组具有写权限的文件,把源文件该为在原来的基础上后面加上.new  

  108.        # find /tmp -perm -020 -exec mv {} {}.new \;即可完成  

  109. For example:在/logs目录中查找更改时间在10日以前的文件并删除它们:  

  110.        # find logs -type f -mtime +10 -exec rm {  } \;  

  111. 注:在一次强调下动作的注意事项:  

  112.    find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。  

  113.    # find . -name"*.conf"  -mtime +5 -ok rm {  } \;  

  114.    按y键删除文件,按n键不删除。  

  115.    所以当使用mv或者是rm的时候,记住一定要使用-ok来提示我们每一步的操作是否移动、更改、删除等信息  

  116. 下面我们来用相应的实例来介绍下find相关高级用法:  

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

  118.    # find /var -user root -group mail  

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

  120.    # find /usr -not -user root -a -not -user bin -a -not -user student  

  121.    # find /usr -not \( -user root -o -user bin -o -user student \)  

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

  123.    # find /etc -mtime -7 -not \ ( -user root -o -user student \)  

  124.    # find /etc -mtime -7 -not -user root -a -not -user student  

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

  126.    # find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;  

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

  128.    # find /etc -size +1M >> /tmp/etc.largefiles  

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

  130.    # find /etc -not -perm /222 -ls  

  131. 7、find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个hdoop用户。  

  132.    # find /etc -name"passwd*" -exec grep "hdoop" {  } \;  

  133.    hdoop:x:501:501::/home/hdoop:/bin/bash  

  134. 8、find命令将删除当目录中访问时间在7日以来、含有数字(数字为三位数)后缀的admin.log文件。  

  135.    # find . -name"admin.log[0-9][0-9][0-9]" -atime -7  -ok  

  136. 注:在做此题目时,自己可以创建相应地文件来进行测试  

                好了,不说这么多废话,让我们来一起学习find命令的使用吧: