zoukankan      html  css  js  c++  java
  • 文件查找

    文件查找

    目录

    1.查找命令分类
    2.locate
    3.find
    4.zgrep/grep
    5.补充

    1.查找命令分类

    文件查找的命令有:locate,find,zgrep/grep
    在这里我按照自己的理解把有关文件搜索查找的命令分为以下几类。
    非实时查找(数据库查找):locate
    实时查找:find,zgerp/grep
    根据文件的元数据查找:locate,find,grep
    根据文件的数据查找:zgrep/grep

    2.locate

    locate命令用于查询系统上预建的文件索引数据库/var/lib/mlocate/mlocate.db。而索引的构建是在系统较为空闲的时候自动进行的(周期性任务)。
    当然,管理员也可以手动更新数据,使用undatedb命令,但请谨慎使用!!这是因为索引构建过程是需要遍历整个根文件系统的,这就极其消耗资源,所以系统才会在空闲时间构建。
    locate命令的工作特点:查找速度快;模糊查找;非实时查找;搜索的是文件的全路径,不仅仅是文件名;可能只搜索用户具备读取和执行权限的目录。
    下面说下locate命令的常用到的:

    locate - find files by name
    locate [OPTION]... PATTERN...
    -i:不区分大小写的搜索
    -n N: 只列举前N 个匹配项目
    -r, --regexp REGEXP:可以使用正则表达式来进行搜索
    --regexp:可以使用扩展的正则表达式来进行搜索

    大家可以通过locate --help来查看更多的选项信息,这里简单列举个例子:

    搜索名称或路径中带有“conf”的文件
    locate conf
    搜索以“.conf”结尾的文件
    locate -r ".conf$"
    locate --regexp ".conf$"

    因为locate是非实时查找,所以搜索到的文件数据不一定是最新的,虽然可以通过undatedb进行更新,但真的不建议用,特别是在工作环境中。

    3.find

    find命令是实时查找命令,是通过遍历指定路径来完成文件查找的。
    find命令的工作特点:查找速度略慢;精确查找;实时查找;可能只搜索用户具备读取和执行权限的目录。
    find命令的用法:

    find - search for files in a directory hierarchy
    find [OPTION]... [ 查找路径] [ 查找条件] [ 处理动作]

    查找路径:指定具体目标路径;默认为当前目录
    查找条件:指定查找的标准;默认为找出指定路径下的所有文件
    处理动作:对符合条件的文件做些操作;默认屏幕输出
    下面具体说下都有那些查找条件和处理动作

    (1)查找条件

    搜索层级:

    -maxdepth level :最大搜索目录深度, 目录为第几级
    -mindepth level :最小搜索目录深度

    根据文件名和inode查找:

    -name " 文件名称":支持使用glob(通配符),*, ?, [], [^]
    -iname " 文件名称":不区分字母大小写
    -inum n:按inode 号查找
    -samefile name:相同inode 号的文件
    -links n:链接数为n 的文件
    -regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称

    根据属主、组查找:

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

    根据文件类型查找:

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

    组合条件:

    -a:与
    -o:或
    -not , !:非
    !A -a !B = !(A -o B)
    !A -o !B = !(A -a B)

    根据文件大小来查找:

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

    根据时间戳进行查找:

    -atime [+|-] num:是以天为单位的,且表示法同上所示。
    num:[num,num+1)
    +num:[num+1, ∞ ]
    -num:[0,num)
    -mtime:以天为单位,格式同上
    -ctime:以天为单位格式同上
    -amin:以分钟为单位,格式同上
    -mmin:以分钟为单位,格式同上
    -cmin:以分钟为单位,格式同上

    根据权限查找:

    -perm [/|-] MODE
    MODE:权限的精确匹配
    -MODE:任何一类(u,g,o)对象的权限中只要能一位匹配即可。
    /MODE:每一类对象必须同时匹配指定的权限。
    0:0所在类表示对这类权限不关注

    (2)处理动作

    -print:默认的处理动作,显示至屏幕
    -ls :类似于对查找到的文件执行“ls -l” 命令
    -delete:删除查找到的文件
    -fls file:查找到的所有文件的长格式信息保存至指定文件中
    -ok COMMAND {} :对查找到的每个文件执行由 COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认
    -exec COMMAND {} :对查找到的每个文件执行由COMMAND 指定的命令
    {}:用于引用查找到的文件名称自身
    -prune:如果文件是个目录,则目录下的所满足条件的文件也不选择, 用于排除

    注意
    find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令

    下面具体下几个例子供大家参考:
    1.查找/var 目录下属主为root ,且属组为mail 的所有文件:

    2.查找/var目录下最近一周内其内容修改过,同时属主不为root ,也不是postfix 的文件:

    3.查找/etc 目录下所有用户都没有写权限的文件:

    4.zgrep/grep

    zgrep/grep命令是实时查找命令,是通过遍历指定路径来完成文件查找的。
    zgrep 命令的功能是在文件数据中寻找匹配正则表达式所描述字段(范本样式)的文件,也就是说,它找的是文件数据而不是文件元数据,根据你所需要找到文件数据(范本样式)而来找到包含这个数据(范本样式)的文件。用法和grep命令一样,man帮助上面说是主要针对压缩文件的,实际上什么文件都可以操作(我已知的)。
    grep命令不管是根据文件元数据还是文件数据都可以查找到所需的文件,比zgrep强大。
    这里列几个有关根据所需内容(范本样式)来查找文件的zgrep用法:

    zgrep - search possibly compressed files for a regular expression
    zgrep [ grep_options ] [ -e ] pattern filename...
    -l <范本样式>:列出文件内容符合指定的范本样式的文件名称。
    -h <范本样式>:在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
    -H <范本样式>:在显示符合范本样式的那一列之前,标示该列的文件名称。
    -e <范本样式>:指定字符串作为查找文件内容的范本样式。
    -e :实现多个选项间的成逻辑or关系,grep –e ‘cat ’ -e ‘dog’ file

    上面提到过find的命令处理动作中有关对找到的每个文件执行command的用法,这就是把每个文件作为参数来进行操作,实际上有个专门的命令可以做到,那就是xargs。

    5.补充:参数替换命令xargs

    由于很多命令不支持管道|来传递参数,而日常工作中有这个必要,所以就有了xargs命令
    xargs 用于产生某个命令的参数,xargs 可以读入 stdin 的数据,并且以空格符或回车符将stdin 的数据分隔成为arguments
    有些命令不能接受过多参数 ,命令执行可能会失败,xargs也可以解决这个问题。也就是我提到的find命令找到大量文件,可以通过xargs来进行处理的原因。

    xargs - build and execute command lines from standard input
    xargs [-0prtx] [-E eof-str] [-e[eof-str]] [--eof[=eof-str]] [--null] [-d delimiter] [--delimiter delimiter] [-I replace-str] [-i[replace-str]] [--replace[=replace-str]] [-l[max-lines]] [-L max-lines] [--max-lines[=max-lines]] [-n max-args][--max-args=max-args] [-s max-chars] [--max-chars=max-chars] [-P max-procs] [--max-procs=max-procs] [--process-slot-var=name] [--interactive] [--verbose] [--exit] [--no-run-if-empty] [--arg-file=file] [--show-limits][--version] [--help] [command [initial-arguments]]

    从上面可以看到xargs的选项好多好多,这里就不在一一描述了,这里有需要注意的是,当管道前的命令的标准输出作为xargs的参数时,要注意其格式,要注意文件名或者是其他意义的名词内含有空格符的情况。
    示例:

    ls f* |xargs rm
    find /sbin -perm +700 |ls -l :这个命令会提示错误,下面才是正确的。
    find /sbin -perm +7000 | xargs ls –l

    上述就是我目前为止所知的文件查找命令,能力有限,不对的地方欢迎纠正。

  • 相关阅读:
    ecos之widget
    一个php小白找工作的历程
    php知识点总结(待续)
    2
    php笔试题1
    兄弟连面试宝典php
    第二十一章 消费者选择理论
    第二十章 收入不平等与贫困
    第十九章 收入与歧视
    第十八章 生产要素市场
  • 原文地址:https://www.cnblogs.com/shenxm/p/7616188.html
Copyright © 2011-2022 走看看