Linux文件查找

文件查找
    locate,find

    在文件系统上查找符合条件的文件;

          实现工具:locate,find

  locate:
      依赖于实现构建好的索引库;
            系统自动实现【定时任务】;
            手动更新数据库(updatedb);
      工作特性:
          查找速度快;
          模糊查找;
          非实时查找。

    使用yum安装locate : yum install mlocate
    locate [OPTION]... PATTERN...
      -b 仅仅匹配基名
      -c count 统计出符合条件的个数
      -r BRE基于基本正则表达式

    注意:索引构建过程,即updatedb需要遍历整个根文件系统,机器消耗资源

  find:
      实时查找工具,通过便利指定其实路径下的文件系统层级结构完成文件查找;

      工作特性:
          查找速度略慢;
          精确查找;
          实时查找。

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

              查找起始路径:指定具体搜索目标起始路径,默认为当前目录;
              查找条件:指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等标准进行,默认为找出指定路径下的所有文件。
              处理动作:对符合查找条件的文件做出的操作,例如删除等操作,默认为输出至标准输出。可以使用ls等命令。

  查找条件:
    表达式:选项和测试组成

       测试:【结果通常为布尔型(false,true)】
             根据文件名查找:
                    -name "pattern"
                    -iname "pattern" 不区分大小写
                          支持glob风格的通配符 *,?,[],[^]
                    -regex pattern 基于正则表达式模式查找文件,匹配的是整个路径,而不是文件名【没弄明白,一般不用】

             根据文件的从属关系查找
                -user username
                -group groupname

                -uid uid 查找属主指定的UID的所有文件
                -gid GID 查找属组指定的GID的所有文件

                 -nouser  查找没有属主的文件
                -nogroup  查找没有属组的文件
        没有属主和属组的文件是很危险的,需要定期查找系统中没有属主和属组的文件。

根据文件的类型查找:
      -type TYPE:
        f:普通文件
       d:目录文件
        l:符号链接文件
       b:块设备文件
       c:字符设备文件
       p:管道文件
       s:套接字文件

 组合测试:
      与:-a 默认是与组合逻辑,两个条件都满足才输出
      或:-o 如果一个条件符合,则输出 shi
      非:-not或者-! 
        例如:find /tmp -not -user "juha" -ls 显示tmp目录下属主不是juha的所有文件

          !A -a !B = !(A -o B)
          !A -o !B = !(A -a B)

  注意,使用组合时,如需使用括号,则需使用转义符即\( 和\)

  根据文件的大小查找:
        -size [+|-] #unit
            常用单位:k,M,G

              #unit:(#-1,#] 大于这个值减一,但是小于等于这个值
              -#unit:[0,#-1] 小于等于这个值减一
              +#unit:(#,∞) 大于这个值

  根据时间戳查找:
            a access,c change,m modify
            以天为单位:
                -atime [+|-]#
                      #:[#,#-1]过去#天一天之内
                      -#:(#,0] 距离现在#天之内
                      +#(-∞,#-1] #天之前
                -mtime 
                -ctime
            以分钟为单位
                -amin
                -mtime
                -ctime 

    根据权限查找:
          -perm [/|-] mode
              mode: 精确权限匹配 例如777
              / mode:任何一类用用户(u,g,0)的任何一位(rwx)符合条件即满足  ,9位权限或关系
                例如 find /tmp /111 代表查找至少一个组有执行权限的,find /tmp /001查找其他组中有执行权限的文件
              -mode:每一类用户(u,g,o)中的每一个位同时符合条件即可,9位权限是与关系
                例如,find /tmp -111 代表查找三类组都应该有执行权限,find /tmp -011查找其他组且属组中中有执行权限的文件


  处理 动作(对最后一个输出的结果生效,如果是或,注意使用括号):
      -print:输出至标准输出,默认的动作;
      -ls:类似于对查找到的文件执行ls -l命令,输出文件的详细信息;
      -delete 删除查找到的文件
      -fls /path/to/file 把查找到的所有文件的长格式信息保存至指定文件中。危险,不建议做。
      -ok COMMAND {} \; 对查找到的每个文件执行COMMAND命令操作,{}的作用是引用查找到的文件名 的,但是改了多少个文件就要手动确认多少次。  
          例如:find ./ -nogroup -ok chown root:root {}\; 表示对查找到的没有属组的文件执行改变属主和属组为root。
      -exec COMMAND {}\;对查找到的每个文件执行COMMAND命令操作,无需确认操作。
          例如:find ./ -perm /002 -exec mv {} {}.danger \;表示把当前目录下的其他组有写权限的文件更名为原文件名后加.danger。

    注意:find传递查找 的 文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;但是有些命令不能接受过长的参数,此时命令执行会失败,可通过另一种方式避免此问题:
          find | xargs COMMAND

你可能感兴趣的:(Linux文件查找)