find命令的详细解析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了find命令的详细解析相关的知识,希望对你有一定的参考价值。

1.find功能

  • 实时查找工具,通过遍历指定路径完成文件查找
  • 特点:查找速度略慢 (因为是实时查找,需要经历每个路径才能完成查找)
    ???精确查找
    ???可能只搜索用户具备读取和执行权限的目录 (没有权限无法进行操作)

说到了find这个命令,相应的就会想到locate这个命令
locate这个命令也是具有查找的功能,现在我们来了解一下两者之间的差别
?locate

  • 非实时查找工具,依据数据库完成查找
    ?查询系统上预建的文件索引数据库
    ???/var/lib/mlocate/mlocate.db
  • 特点:查找速度快 (依据数据库查找,直接到数据库的文件路径中搜寻就可以)
    ???模糊查找
    ???非实时查找 (在系统空闲时更新数据库或者管理员手动更新,过程极消耗资源,数据无法实时更新)
    ???搜索的是文件的全路径,不仅仅是文件名
    ???可能只搜索用户具备读取和执行权限的目录
    虽然find和locate这俩个命令都具有查找的功能,但是查找时因为特点有所差别,所以通常使用find来进行查找

2.find命令语法

  • find [OPTION]... [查找路径] [查找条件] [处理动作]
    ??查找路径:指定具体目标路径;不指定则会默认为你所在的当前目录
    ??查找条件:指定的查找标准,例如可以根据文件名、文件大小、文件类型、文件的权限等标准来进行查找(后面会具体讲到)
    ??处理动作:对符合条件的文件进行具体操作,不进行操作则默认输出至屏幕

    3.find命令选项

    ??现在来具体分析一下有关find这个命令的有关选项
    首先先看一下有关查找条件的选项

  • 搜索层级

         find -maxdepth level      最大目录深度,指定目录为第1级
          -mindepth level       最小搜索目录深度
         搜索目录深度是相对于当前所在目录来说的,现在让我们自己建个目录和文件来看一下

首先,随便进入到一个不会影响系统的目录,我进入到/app下,(将/app里的所有内容删除防止影响接下来的结果显示)然后创建目录
回顾一下之前学过的mkdir:mkdir -p 创建多级目录; mkdir -v 显示创建的具体信息
再创建几个文件,为了方便识别,所以这样创建目录和文件
技术分享图片
技术分享图片
好了,现在让我们敲一下这俩个有关查找目录深度的文件find命令
技术分享图片
?看显示的搜素结果可以知道,-maxdepth 搜索最大目录深度也就是说你敲5意味着最多只搜索到第5级目录不会再向下搜索了,第5级目录是搜索的最终
技术分享图片
技术分享图片
?看这次显示的搜索结果,-mindepth 搜索最小目录深度也就是说你敲2意味着搜索是从第二级目录开始的,然后搜索到最后子目录及子文件


如果我说的这些大白话你还没有看明白,不要着急,你自己试着创建然后敲一下命令就很容易理解了


  • 文件名

         find -name filename    (支持使用通配符)
         find -iname filename      不区分字母大小写

用find命令查找文件是可以使用通配符的
好,现在看一下这俩条命令,还是在/app里,先把之前创建的都删除,创建几个名字类似的文件
技术分享图片


个人觉得这俩条命令很容易理解,所以如果你不理解,还是一样,敲一下喽


          find -links n        链接数为n的文件

这里的这个链接数指的是硬链接,查看链接数应该用stat这个命令,之前有提过,所指示的位置就是显示的文件的硬链接数
技术分享图片
好,这一次我们就不自己创建了,我们直接找一个目录然后查找看一下,我进入/tmp下
技术分享图片
来随意验证一个文件看是不是硬链接数是2
技术分享图片

          find -regex "PATTERN"        以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

注意,在这个命令选项里,匹配的模式。也就是说你想匹配的字符串一定是文件的路径,支持正则表达
看一下示例
技术分享图片
蓝色框里的就是错误的,错误的地方在于字符串模式不是路径,所以没有结果而横线的位置就是想要匹配的正则表达的字符串模式

  • inode号

         find -inum n 按inode号查找
         find -samefile name 相同inode号的文件

回顾一下查看文件的inode号用到的命令是 ls -i ,stat也能查到,在刚才查看的硬链接数旁边就是哦,圈圈出来的就是
技术分享图片
至于操作跟硬链接数的模式是一样的这里就不演示了

  • 所属主、所属组:

            find -user USERNAME      查找属主为指定用户的文件
            find -group GRPNAME      查找属组为指定组的文件
            find -uid UserID       查找属主为指定的UID号的文件
            find -gid GroupID       查找属组为指定的GID号的文件
            find -nouser       查找没有属主的文件
            find -nogroup        查找没有属组的文件

现在我们还是进入到/app下,创建三个文件,并且分别把这三个文件的所属主和所属组改一下,并且分别删除一个所属主和所属组,先来看一下显示的结果
技术分享图片
技术分享图片
还是先回顾一下之前学过的,修改所属主和所属组的时候要确保主和组都存在,不然就要提前先创建,用到了useradd和groupadd;删除用到了userdel和groupdel,userdel -r 则表示删除这个用户所有信息,可一看到,文件的所属主和所属组被删除之后,所对应的位置变成了数字,好了,现在我们敲一下命令看一下显示的结果
技术分享图片
可以看到,当你同时搜索所属组和所属主的时候,如绿框所示,表示并且的关系,也就是说这个文件的所属主是liubei,所属组还需要是maidou才符合搜索的条件,好的,继续
技术分享图片
查找所属主和所属主的命令就是这样了,至于那俩个搜索UID和GID的命令选项,就是在选项uid或者gid后面加上你所要搜索的指定的uid数或者gid数就可以了,就不演示了

  • 文件类型

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

好,看到这可能问题来了,就是文件类型从哪里看呢,那就用到了 ll 这个命令啦,看一下
技术分享图片
可以看到首先我创建了一个目录文件,那么长形框里就是文件类型啦
技术分享图片
用法就是这样的啦

  • 条件组合

     组合条件
          与: -a            或: -o          非: -not, !
     德·摩根定律:
          (非 A) 或 (非 B) = 非(A 且 B)
          (非 A) 且 (非 B) = 非(A 或 B)

这个组合条件前面就已经学过了,所以就当做复习一下可以了,摩根定律个人记忆方法就是括号外和括号里所表达的意思相反,也就是非或就是且,非且就是或,这个的示例我们跟下面会讲到的权限条件合在一起说

  • 根据文件大小来查找

             find -size [+|-] # UNIT(单位)
                                        常用单位: k, M, G, c(byte)
                    # UNIT: (#-1, #]
                 如: 6k 表示(5k,6k]
                    -# UNIT: [0,#-1]
                 如: -6k 表示[0,5k]
                    +# UNIT: (#,∞)
                  如: +6k 表示(6k,∞)

这个选项包括下面要说到的时间里的参数的模式个人认为只能死记硬背了,如果你有更好的方法当然最好了,这个示例就不做了,还要创建指定大小的文件,后面有练习具体看一下就可以了,不难理解只是需要记忆

  • 时间戳

          以“天”为单位;
                 find -atime [+|-]#,
                          #: [#,#+1)
                         +#: [#+1,∞]
                         -#: [0,#)
                  find -mtime
                  find -ctime
           以“分钟”为单位:
                  find -amin
                  find -mmin
                  find -cmin

这里回顾一个知识点,atime:access time 文件被访问改变
??????????mtime:modify time 文件被修改改变
??????????ctime:change time atime或者mtime改变,ctime就改变

  • 权限查找

            find -perm [/|-]MODE
                  MODE:   精确权限匹配
                  /MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可,或关系, 
                  +MODE   只适用于CentOS7之前的系统
                  -MODE: 每一类对象都必须同时拥有指定权限,与关系
                 0 表示不关注

现在我们把组合条件和权限合到一起看一下,首先我还是进入到/app下,当然里面的内容已经被我都删除了,创建几个文件,然后改一下每个文件的权限,随便改,看一下每个文件的权限
技术分享图片
然后我们来根据权限查找文件
技术分享图片
对照着上面的权限,可以看出,直接敲222,就是精确的匹配权限就是222的文件;前面加/的,则是表示匹配任意一类的用户有2也就是写权限的文件就可以,也就是或者的意思;前面加-的,就是表示匹配所有人的都有2也就是写权限的文件,也就是并且的意思,并且加/和-的匹配是没有限制的权限不关注就可以了
再看
技术分享图片
这个则是跟摩根定律一样的思路了,不是所有人都要有写的权限,那么就是任意一类用户没有写权限就可以了,同理,不是任意一类用户有写权限,也就是所有人都没有写权限

  • 处理动作

          -print     默认的处理动作,显示至屏幕
          -ls     类似于对查找到的文件执行“ls -l”命令
          -delete     删除查找到的文件
          -fls file     查找到的所有文件的长格式信息保存至指定文件中
          -ok COMMAND {} \;     对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认(也就是会执行之前询问)
          -exec COMMAND {} \;     对查找到的每个文件执行由COMMAND指定的命令(不询问)

    ?{} ?用于引用查找到的文件名称自身
    ?find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令
    看一下
    技术分享图片
    长形框里是找到符合条件的文件,随着绿色箭头传递给了蓝色横线所标记的cp复制的这个命令,而中括号里所引用的就是长形框里查找的文件,而这个条命令表达的意思就是备份以.conf为结尾的文件并且后面加个.orig的后缀,所以显示的结果如粉色圈圈中的一样
    技术分享图片
    这条命令要表达的就是删除/tmp下存在4天或者超过四天的所属人是joe的文件之前询问一下,问啥询问你知道不,因为粉色圈里的 -ok 啊,执行之前要询问
    技术分享图片
    前面我也不记得说没说过了索性就再说一遍,如果你查找的不是当前目录下的文件,那么一定要在find 后面加上你要寻找的文件所在目录的目录名,也就是跟紫色双线一样,这条命令就是说长列出家目录下的目录文件


既然说到了find 这个命令,那我们就顺便说一下xargs这个命令,原因是啥呢,因为find 不支持管道 | 来传递参数,你看完下面你就知道了他俩的关系了


顺便一提

  • xargs产生的缘由:由于很多命令不支持管道|来传递参数,而日常工作中经常有这个必要,所以就有了xargs命令
  • xargs作用用于产生某个命令的参数, xargs 可以读入 stdin 的数
    据,并且以空格符或回车符将 stdin 的数据分隔成为arguments
  • 注意:文件名或者是其他意义的名词内含有空格符的情况
  • 还有一种情况:参数过多,正常命令是可以执行,但是有些命令不能接受过多参数,命令执行可能会失败, 就可以用xargs解决这个问题
  • 示例:
    ??ls f* |xargs rm
    ??find /sbin -perm +700 |ls -l 这个命令是错误的,find不支持管道 | 传递参数
    ??find /sbin -perm +7000 | xargs ls –l
  • find和xargs格式: find | xargs COMMAND

练习1.查找/etc目录下大于1M且类型为普通文件的所有文件
技术分享图片
2.查找/var目录下不属于root、 lp、 gdm的所有文件
技术分享图片
查找的文件太多了截不下,凑合看吧,注意蓝色横线标记的,不是或者就是并且


3.查找/var目录下最近一周内其内容修改过,同时属主不为root,也不是postfix的文件
技术分享图片
修改过,所以是-mtime,一周以内就是小于7天,所以是 -7


4.查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件
技术分享图片
都有执行权限,就是-111;其他用户有写权限,是-002,因为0表示不关注;相加就是最终查找条件

总结:以上就是有关 find 这个命令的全部解析和相关内容,个人认为很多时候多敲几遍比看几遍效果来的要号提案多

以上是关于find命令的详细解析的主要内容,如果未能解决你的问题,请参考以下文章

mvn命令异常:An error has occurred in Javadoc report generation: Unable to find javadoc command异常已解决(代码片段

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段

使用sunOS中的find命令比较两个目录中的所有文件

find 命令详细解释

Linux findgrep命令详细用法

全网最详细的Linux命令系列-Find命令