文件查找命令:locate, find

 

 文件的位置在windows上面可能在CDEF的某一个分区上或在整个操作系统上的每个分区上面,而对于linux上的系统而言,是由一个根文件系统的统一入口而组成的;在根文件系统上有很多个分支,可以将某个分关联到文件系统的一个空的目录下。而文件查找就是在文件系统上查找符合条件的文件;

 

 先来说一下locate命令的使用;

 Locate的实现机制是根据事先构建的索引来进行文件查找的,并且查找类型是模糊查找,locate的查找速度非常快,它不是遍历整个文件系统进行的查找而是通过查找索引数据库进行模糊匹配来查找的;系统的索引库一般是系统通过周期性任务在空闲时自动实现的,它并不是实时的,也可以通过手动更新索引数据库的方法来更新,但是占用的系统资源还是比较大的,强烈建议不要进行手动更新

 

通过locate来搜索文件是有局限性的,比如买来一本书,locate就好比书的目录,如果要查找书里面的内容,通过目录可以快速的找到,但是如果把书的后面几页撕掉了,目录上的还能看到,但书中内容就无法找到了,同样locate也不能做到对文件的实时记录,如果删掉文件后,locate还是可以找到文件的,这有时候就给我们的工作带来了很多不便。

 

locate更好用的命令find

Find命令是通过遍历指定起始路径下文件系统层级结构完成文件查找的一款实时查找工具;

它的工作特性具有:查找速度比locate略慢;可以精确查找;可以实时查找;

 

Find命令具体使用方法:

find [OPTIONS] [查找起始路径] [查找条件] [处理动作]

 

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

    查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为找出指定路径下的所有文件;

处理动作:对符合查找条件的文件做出的操作,例如删除等操作;默认为输出至标准输出;

 

查找条件与处理动作是我们学习的重点

find中我们把查找条件主要分为选项和测试;

一、测试

1、根据文件名进行查找的;并且支持glob(文件名通配)风格的通配符格式进行查找;

常见的格式:

      -name “pattern”

         -iname “pattern”   iname:表示不区分文件名大小写

   示例:~]# find /etc -name “passwd”find /etc -iname passwd

             ~]# find /etc -name “passwd*”find /etc -iname passwd*

    2、根据文件的从属关系查找:

            -user USERNAME: 查找属主指定用户的所有文件;

            -group GRPNAME: 查找属组指定组的所有文件;

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

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

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

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

   

         示例:~]# find /etc –user root

             ~]# find /etc –uid 3000

 

   3、根据文件的类型查找:

           -type TYPE:

              f: 普通文件

              d: 目录文件

              l: 符号链接文件

              b: 块设备文件

              c: 字符设备文件

              p: 管道文件

              s: 套接字文件

 

        示例:~]# find /etc –type b 表示在/etc下查找块设备文件 

             ~]# find /etc –type f 表示在/etc下查找普通文件

 

    4、组合测试:

       与:-a,默认组合逻辑;两个查找的参数都必须匹配

        示例:~]# find /etc fstab –a issue

       或:-o,表示有一个参数匹配即可

        示例:~]# find /etc –type b –o -nouser

       非:-not, !表示取与所查结果相所的值

        示例:~]# find /etc -nouser

    5、根据文件的大小查找:

            -size[+|-]# 常用单位:k,M,G默认为字节

              #UNIT: 5M 表示查找5M的文件

              -#UNIT: -5M 表示查找小于5M的文件

              +#UNIT: +5M表示查找大于5M的文件

 

        示例: ~]# find /etc –size +5M

 

    6、根据时间戳查找:

        以“天”为单位:

            -atime [+|-]#

              -#:表示#天内访问过的文件

              +#:表示#天外访问过的文件

              -mtime

              -#:表示#天内更改过的文件

              +#:表示#天内更改过的文件

 

        示例:~]# find /etc –atime -7

 

        也可以以“分钟”为单位:

              -amin

              -mmin

              -cmin

 

        示例:~]# find /etc –amin -60

                

       7、根据权限查找:

          -perm [/|-]mode 

            mode: 精确权限匹配;find ./ -perm 644 -ls

      /mode: 任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件即满足; 

 

      示例:find ./ -perm /666[/001]

                      

          -mode: 每一类用(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;

 

          示例:find ./ -perm -222

                     

     二、处理动作:

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

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

         -delete: 删除查找到的文件;

         -fls /PATH/TO/SOMEFILE: 把查找到的所有文件的长格式信息保存至打指定文件中;

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

        示例: find ./-nouser -a -nogroup -ok chown root:root {} \;

 

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

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

 

  注意:find传递查找到的文件路径至exec后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败;