概览:在Linux中使用文件系统时,经常会有这查找文件的需要。那么如何按照我们的需求去找出相应的文件。在这里我推荐两个命令,locate命令和find命令。此篇博文主要向大家介绍find命令的用法。

   那么为什么不讲locate而只讲find命令?在这里,我有必要解释一下这两个命令的工作机制。

   一、locate命令工作机制

    在linux系统中会事先构建好一个文件索引数据库用于给locate查询,来找到符合用户需求的文件。这个数据库是由Linux系统自动进行为维护和更新的。所以这不是实时查找,举个例子,当你在使用过程中新建了一个文件,而工作了一段时间你忘了这个文件具体在哪里放着,你想找到这个文件,那么就需要查找,如果用locate来查找的话,此时数据库并没有实时更新。当然你也可以用updatedb命令来手动更新系统的数据库,但更新数据库的代价比较大,会增加系统消耗。此时,我们就推荐另一个查找命令——find命令。

   二、find命令工作机制

    find命令是Linux系统中的实时查找文件工具,它是通过遍历用户指定起始路径下文件系统层级结构来完成文件查找,即查找你指定目录下的所有文件及其子目录的文件。

   三、find命令的工作特性

    1、查找速度略慢。

    2、实现精确查找。

    3、实时查找。

   四、find命令使用方法

    使用格式:find [OPTIONS] [查找起始路径] [查找条件] [处理动作]

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

        查找条件:用户指定的查找标准(表达式),例如文件的文件名、大小、类型、从属

             关系、权限等;如不指定,则查找出当前目录下的所有文件。

        处理动作:对符合查找条件做出的操作,例如删除等处理操作;如不指定,默认为输

             出至标准输出。

     查找条件规范:

        表达式:选项和测试

        ·1、测试:结果是布尔型(“true”,“false”)

        (1)根据文件名查找:

           选项:

             -name "pattern":根据被模式匹配到的文件名进行查找。

             -iname "pattern":根据被模式匹配到的文件名进行查找。忽略字符大

                      小写。

             注意:此处的模式(pattern)是根据bash的globbing风格来查找。

             -regex "pattern":基于正则表达式模式来查找文件,匹配的是整个路径

                      而非文件名。

        (2)根据文件的从属关系进行查找

           选项:

             -user USERNAME:查找从属于指定用户的文件

 -group GROUPNAME: 查找从属于指定用户组的文件

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

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

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

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

           注意:针对特定的某一用户被删除之后,从属于这一用户的文件则会变为无属

             主、无属组的文件,此时文件从属于原先此用户的用户ID和组ID。

        (3)根据文件的类型进行查找。

           选项:

            -type TYPE:

    f:普通文件

        d:目录文件

                l:符号链接文件

    b:块设备文件

    c:字符设备文件

    p:管道文件

    s:套接字文件

        (4)根据文件的大小进行查找

           选项:

            -size [+|-] NUMBER 单位 默认单位为字节

   [+|-] NUMBER K

   [+|-] NUMBER M

   [+|-] NUMBER G

           注:+ 表示大于,- 表示小于,无则表示精确

           注意:1、精确是指(NUMER-1,NUMBER]的范围,不能比它小太多,不能比它大。

              2、- 大于的范围是[0,#-1],即比它小1以下的大小。

              3、+ 大于的范围是(NUMBER,∞)。

        (5)根据时间戳查找:

           选项:

            以“天”为单位,向过去的时间倒回。

            -atime [+|-] NUMBER:访问时间

    NUMBER(精确时间) : [NUMBER,NUMBER-1]

-NUMBER(最近NUMBER天内): (NUMBER,0)

+NUMBER(超过NUMBER天): (∞,NUMBER-1)

-mtime [+|-] NUMBER:修改时间(文件内容)

-ctime [+|-] NUMBER:改变时间(元数据)

    以“分钟”为单位: (与上雷同)

-amin [+|-] NUMBER

-mmin [+|-] NUMBER

-cmin [+|-] NUMBER

           例如:查找/etc目录下最近一周内其内容修改过的文件

            ~]# find /etc/ -mtime -7

        (6)根据权限查找

           选项:

            -perm [/|-] mode

    mode : 精确权限匹配:

    -mode :全部用户(u,g,o)的权限中的每一位(r,w,

                x)都符合条件即满足查找条件,9位权限之间是"与"关系。

    /mode :任何一类用户(u,g,o)的权限中的任何一位(r,w,

                x)符合条件即满足(9位有一位符合即可)9位权限是"或"关系。

    例如:1、查找/etc/目录下对于至少有一类用户有执行权限的文件。

                     ~]# find /etc/ -perm /111

                2、查找/etc/init.d目录下,所有用户都有执行权限,且其他用户有

                写权限的普通文件。

                ~]# find /etc/init.d/ -perm -113 -type f

              ~]# find /etc/init.d/ -perm -222 -a -perm 002 -type f

       ·2、组合测试:

            与(and):-a, 默认组合多个条件时的逻辑

或(or):-o  

非:-not

            例如:1、查找/etc目录下超过一周其内容被修改过,且文件大小不超过5M.

              ~]# find /etc/ -mtime -7 -a -not -size -5M

               2、查找/etc目录下所有用户都没有写权限的普通文件。

                思路:反向解析题意即至少有一类用户有写权限;

                ~]# find /etc/ -not -perm /222 -type f

                3、查找/etc目录下至少有一类用户都没有写权限的普通文件。

                思路:反向解析题意即所有用户有写权限

                 ~]# find /etc/ -not -perm -222 -type f 

  

     处理动作:

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

        -ls:类似于对查找到的文件执行“ls -l”命令,输出文件的详细信息

-delete:删除查到的文件

-file 文件路径:把查找到的所有文件的长格式信息保存至指定文件中;

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

                  由用户进行确认;

-exec COMMAND {} \; : 对查找到的每个文件执行由COMMAND表示的命令。

    

     注意:find传递查找到的文件路径传至后面的命令时,实现查找出所有符合条件的文件路

        径,并一次传递给后面的命令;但是有些命令不能接受过长的参数,此时命令会执行

        失败;另一种方式可规避此问题:

~]# find | xargs COMMAND

    

    总结:find命令的众多查找选项和条件的组合可以更好地为用户的查找文件的需求服务,但是对于根据文件大小的具体大小范围以及时间戳部分的时间范围需要深刻理解,才能找到你符合你需求的文件。另外权限部分的理解也很重要,初学者很容易会绕晕,建议查看文件权限相关基础内容。让find命令成为你使用Linux的一把利器。