首页 > 代码库 > #14 文件查找之locate与find

#14 文件查找之locate与find

文件查找:按照文件名或文件属性来搜索文件:

locate:

  模糊查找:不区分大小写,不做关键字的定位;

    基于专用的数据库进行查找,数据库应该事先创建,并且定期更新;

    可以使用updatedb命令手动更新locate数据库;

    查找速度非常快,查找精确度非常有限;


find:

  精确查找:

    查找精度高,速度慢:

    在指定的位置进行文件名或文件属性的遍历扫描;强烈不建议对根目录进行find操作;

    实时查找;

    使用find命令只能搜索当前用户具有读取和执行权限的目录;


  find命令:

    find - search for files in a directory hierarchy

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

      查找路径:默认为当前工作目录,可以指定具体的目录路径;

      查找条件:进行本次搜索的标准,可以是文件名、文件大小、文件类型、文件权限等等;默认是指定目录中的所有文件;

      处理动作:对于符合条件的文件进行某个处理操作;默认将查找结果输出到显示器;


    根据文件名查找:

      -name 文件名称,支持使用globbing,(*,?,[],[^])

      -iname 文件名称,支持使用globbing,(*,?,[],[^])


    根据文件的的inode编号查找:

      -inum inode编号:通过给定的inode编号查找对应的文件名及路径;

      -samefile name:通过给定的文件名查找对应的inode编号,进而确定所有具有该inode编号的文件名及路径;

      -links n:查找链接数为n的所有文件;


    根据正则表达式查找:

      -regex pattern:以pattern匹配整个文件路径字符串,而不仅仅是给定文件的名称;


    根据文件的属主和属组进行查找:

      -user uname:根据属主为指定用户的用户名进行查找;

      -uid UID:根据属主为某个UID进行查找;

      -group gname:根据属组为指定属组的用户名进行查找;

      -gid GID:根据属组为某个UID进行查找;


      -nogroup:在文件的属组上没有组对应的组名;

      -nouser:在文件的属主上没有用户对应的用户名;


    根据文件的类型查找:

      -type 文件类型:

        b:块设备

        c:字符设备

        d:目录文件

        f:普通文件

        l:符号链接文件

        p:管道文件

        s:套接字文件

      -xtype:文件类型:符号链接文件的匹配需要配合其他的选项来完成;


    根据时间戳进行查找:

      以天为单位:

        -atime [+|-]n:根须访问时间查找,以天为单位;

        -ctime [+|-]n:根须改变时间查找,以天为单位;

        -mtime [+|-]n:根须修改时间查找,以天为单位;

          n:[n,n+1]从当前时间开始计算,前n天至n+1天;

          +n:[n+1,+∞]从当前时间开始计算,从n+1天开始,至∞天

          -n:[n,0]从当前时间开始计算,n天之内所有;

      以分钟为单位:

        -amin [+|-]n:根须访问时间查找,以分钟为单位;

        -cmin [+|-]n:根须改变时间查找,以分钟为单位;

        -mmin [+|-]n:根须修改时间查找,以分钟为单位;


      例子:

        5-28-11-18

          -mtime -3

        5-25-11-18

          -mtime 3

        5-24-11-18

          -mtime +3


    根据文件的大小进行查找:

      -size [+|-]n[cwbkMG]

        n:(n-1,n]

        -n:[0,n-1]

        +n:(n,+∞)


      例子:

        find -size +2k

          当前目录下所有大于2kb的文件;

        find -size 2k

          当前目录下所有1kb-2kb之间的文件;

        find -size -2k

          当前目录下所有小于1kb的文件;


    组合条件:

      -a:逻辑与

      -o:逻辑或

      -not, !:逻辑非


      逻辑组合条件遵循德摩根定律:

        非(A 与 B)= 非A 或 非B

        非(A 或 B)= 非A 与 非B        


    根据权限进行查找:

      -perm [/|-]mode

        mode:精确匹配指定的权限

        /mode:隐含了逻辑或的关系,任何一个权限位的权限中只要能有一个权限为匹配,即可满足条件;

        -mode:隐含了逻辑与的关系,每一个权限位的权限中都必须同时包含指定权限位,才能满足条件;


      所有都有 取反 任意一个没有 

      ! ( a与b与c ) = !a 或 !b 或 !c

      所有没有 取反 任何一个有

      ! ( !a与!b与!c ) = a 或 b 或 c


    处理动作:

      -print:输出到显示屏幕,默认的动作;

      -ls:对查找到的结果执行ls -li命令显示;

      -exec command {} \;:

      -ok command {} \;:  

        对于查找到的结果执行command命令;

        区别:

          -exec是非交互式的;

          -ok是交互式的;

        {}:占位符,用来引用被find命令查找到的所有文件的路径信息;


      -exec和-ok的取代执行操作:

        chomd a-r $(find -perm -444 -type f)

        find -perm -444 -type f |xargs chomd a-r

        man xargs命令:    


    注意:管道输送的是纯字符串信息,所以如果管道之后的命令不是处理字符串的命令,需要使用xargs命令将其转换成能够被后面命令处理的参数;


#14 文件查找之locate与find