设为首页 收藏本站
查看: 1684|回复: 0

[经验分享] linux下的文件查找

[复制链接]

尚未签到

发表于 2018-5-20 09:38:25 | 显示全部楼层 |阅读模式
  前言
  文件查找:
  在文件系统上查找符合条件的文件;
      这与grep是完全不同的,grep是文本处理工具。find与locate是针对于文件的而不是文件中的文本内容。

  文件查找常用工具:locate, find
  区别:  非实时查找(数据库查找):locate
  实时查找:find
  locate:
  locate的工作机制:
  依赖于事先构建的索引库;索引的构建是在系统较为空闲时自动进行(周期性任务);手动更新数据库(updatedb);
  索引库的构建方式一般有两种:        

  •    系统自动实现;(系统在较为空闲的时候自动进行(周期性的任务)),在操作系统刚装完是没有的。但是操作系统可能定义了一些任务在一段时间后会由某个程序实现自动构建。
  •   手动更新数据库使用updatedb这个命令。

  索引构建过程需要遍历整个根文件系统,极消耗资源;
  locate索引库的构建具体过程:
      系统的周期性的任务程序会遍历整个文件系统。生成一个由keyword和keword的文件路径组成的 K-V数据库,也就是索引库。

      但locate查找某个文件时。locate会去查找索引库,并对keword进行模糊匹配。但是索引库不是实时更新的。也就是说,如果A文件在索引库这次更新和下次更新之间被删除了。那么locate可以查到A文件,但是实际上A文件已经不存在了。你只能在下次索引库更新后才能使用locate发现A文件不见了。强调一下,索引库里记录的是文件路径。也就是说locate查找得到的结果是文件存在的路径。
  工作特点:

  •   查找速度快;
  •   模糊查找;
  •   非实时查找;可能有部分结果不准确。
  locate用法:
       locate [OPTION]... PATTERN...

               -A ,--all 同时满足所有的 PATTERN才可以。

               -b ,--basename只匹配路径当中的基名。
               -c,--count。不把查找结果显示出来而是把复合条件数目的统计出来。

                   -r, 支持基本的正则表达。若不加则不支持。

  
  find:
  find工作机制:
          实时查找工具,通过遍历指定路径下的文件系统完成文件查找;
  工作特点

  •   查找速度略慢;
  •   精确查找;
  •   实时查找;
  find语法:
  find [OPTION]... [查找路径] [查找条件] [处理动作]

  •   查找路径:指定具体目标路径;默认为当前目录;
  •   查找条件:指定的查找标准,可以文件名、大小、类型、权限等标准进行;默认为找出指定路径下的所有文件;
  •   处理动作:对符合条件的文件做什么操作;默认输出至屏幕;

  •   查找条件:
      

      


  •   根据文件名查找:
  -name "文件名称":支持使用glob风格。
  *, ?, [], [^]
  例子 find /etc/  -name
  -iname "文件名称":不区分字母大小写
  -regex "PATTERN":以PATTERN匹配整个文件路径字符串,而不仅仅是文件名称;

  

2.根据属主、属组查找:

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

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

     -uid UserID:查找属主为指定的UID号的文件;

     -gid GroupID:查找属组为指定的GID号的文件;

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

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



3.根据文件类型查找:

     -type TYPE:

     f: 普通文件

     d: 目录文件

     l: 符号链接文件

     s:套接字文件

     b: 块设备文件

     c: 字符设备文件

     p: 管道文件



4.组合条件:

    与:-a

    或:-o

    非:-not, !

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

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

    找出/tmp目录下,属主不是root,且文件名不是fstab的文件;                                     find /tmp -not -user root -a -not -name 'fstab'  -ls                                       find /tmp -not \( -user root -o -name 'fstab' \) -ls



5.根据文件大小来查找:

    -size [+|-]#UNIT

    常用单位:k, M, G

    #UNIT: (#-1, #]  精确查找,例如:find /etc -size 5k 表示 查找文件大小为大于4k小于等于5k的文件。(4,5]k

    -#UNIT:[0,#-1] 例如:find /etc -size -5k 表示查找文件大小大于等于0k且小于等于4k的文件[0,5-1]k

    +#UNIT:(#,oo)例如:find /etc -size +5k 表示查找文件大小大于5k的文件。(5k,+∞)

   

6.根据时间戳:

    以“天”为单位;                                   

    -atime 表示访问时间 。[+|-]#。

    a.  #: [#,#+1)  例如:find  /etc -atime 3 表示以现在查找的时间为基准,过去[3×24小时,4×24)之间被访问过的文件

      如图:

         DSC0000.png

     b. +#: [#+1,oo] 例如 :find /etc -atime +3 表示以现在查找的时间为基准,过去4×24小时之前被访问过的文件。包括从现在时刻之前的4×24小时这个时刻。

如图:

          DSC0001.png                              ·                                                

     c. -#: [0,#) 例如:find /etc -atime -3 表示以现在查找的时间为基准,过去(3×24小时,0×24小时]包含现在时刻被访问过的文件。就是3天内。

            DSC0002.png

    -mtime 表示修改时间

    -ctime 表示改变时间

    以“分钟”为单位:

    -amin

    -mmin

    -cmin

    用法同上。

   总结几个特殊的:

    一天内 find /etc -atime 0 或者 find /etc -atime -1

    一天前 find /etc -atime  +0

    两天前 find /etc -atime +1

    两天内 find /etc -atime -2



6.根据权限查找:

     -perm [/|-]MODE

                             

     a. MODE: 精确权限匹配 表示完全精确匹配。

    示例:查找/etc 下权限为644的文件

    find /etc -perm 644



     b. /MODE:任何一类(u,g,o)用户的任何一位(r,w,x)符合条件即满足;9个权限位只要有一个满足就满足。

        示例:

        查找/etc下至少一类用户有写权限。

        find /etc -perm /222

        查找/etc下所有用户都没有写权限

        find /etc -not -perm /222

        查找/etc下至少一类用户有执行权限。

        find /etc -perm /111

        查找/etc下其他用户有执行权限。

        find /etc -perm /001

        注意:这里的0并不是没有任何权限的意思。而是指任意权限,不关心属主和属组的权限是什么。只关心其他用户有x权限。

        补充:在操作系统上其他用户有写权限的文件是很危险的。不建议这么设定。所以可以 find  /PATH/SONMEFILE  -perm /002 找出来。



     c.  -MODE:每一类用户(u,g,o)的权限中的每一位(r,wx)同时符合条件即满足;

         示例:

        查找/etc下每一类用户都有写权限的文件

        find /etc -perm -222。

        查找/etc下至少有一类用户没有写权限的文件。

        find /etc -not -perm -222。

        特殊的:

        查找/etc 下其他用户有写权限的文件。

        find /etc -perm /002 或者 find /etc -perm -002 二者效果一样的因为我们不关心属主和属组的权限是什么。

        但是find  /etc -perm /022 与 find  /etc -perm -022 就不同了。前者表示属组或者其他用户有写权限。后者表示属组与其他用户都有写权限。

B. 处理动作:

    -print:默认的处理动作,显示至屏幕;

    -ls:类似于对查找到的文件执行“ls -l”命令;

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

    -fls /path/to/somefile:查找到的所有文件的长格式信息保存至指定文件中;

    -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;

    对于每个文件执行命令之前,都会交互式要求用户确认;注意结尾的分号

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

    {}: 用于引用查找到的文件名称自身;注意结尾的分号

    示例:

    查找 /tmp 下其他用户有写权限的文件并修改该文件文some.danger的格式

    find /tmp -perm /002 -exec mv {} {}.danger \;

注意:find传递查找到的文件至后面指定的命令时,查找到所有符合条件的文件一次性传递给后面的命令;有些命令不能接受过多参数,此时命令执行可能会失败;另一种方式可规避此问题:

find | xargs COMMAND

                                    

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-462404-1-1.html 上篇帖子: linux for 循环 下篇帖子: Linux常用Debug命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表