find文件:就是这么简单

概述


由于Linux一切皆文件,我们的日常运维工作其实就是与文件打交道的事,如何能够快速而有效地找到我们需要的文件呢?这是个令人头疼的问题。幸运是,Linux为用户提供了强大的查找工具——find。find通过遍历指定路径完成文件查找,它的的工作特点:

  • 精确查找——多查询条件组合,精确匹配;

  • 实时查找——遍历指定路径;

  • 查找速度稍慢——由于需要遍历路径,速度上受限于文件数量;

  • 可能只搜索用户具备读取和执行权限的目录——基于Linux系统的用户安全权限。

本文基于 GNU/Linx CentOS 7.2.1511,介绍了find命令的日常用法,主要探讨了find的表达式的各种条件查找:

    • find详解

    • 1. 命令格式

    • 2. 常用选项

    • 3. 查找条件
          3.1. 根据文件名和 inode 查找
          3.2. 根据文件类型查找
          3.3. 根据属主属组查找
          3.4. 根据文件大小查找
          3.5. 根据文件时间戳查找
          3.6. 根据权限查找
          3.7. 多条件查找&德摩根定律

    • 4. 动作处理

    • 结束语



find详解


1. 命令格式

        find [OPTION] [PATH…] [expression]

OPTION : 命令选项。所有的选项都总是返回真值,它们总会被执行,除非放在表达式中执行不到的地方。因此,清楚起见,最好把它们放在表达式的开头部分。

PATH… :  搜索路径。 支持多个路径搜索,没有路径参数,缺省用当前目录。还有一个重要方面是,搜索结果的格式取决于正在搜索的路径。若使用的是相对路径,结果也是按相对路径给出;若使用的是绝对路径,搜索结果将都是按绝对路径给出的。

expression :表达式。find的表达式可以分为两个部分:查找条件和处理动作。这也正是find命令的精髓所在。

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

    • 处理动作:对符合条件的文件做操作,默认输出至屏幕


2. 常用选项

    – P   这是默认的行为。当遇到链接文件时,查找条件匹配的是符号链接本身的属性。

    -L    当遇到链接文件时,追寻链接文件的目标进行查找。查找条件匹配的是目标文件的属性。 

    -Olevel    查询优化。优化level分0-3四个等级。


3. 查找条件

find命令有很多种查找条件,下面我将和大家一起通过实例演示,对常用的查找条件进行介绍:

3.1. 根据文件名和 inode 查找

    -name " FILENAME " :支持使用 glob*, ?, [], [^]
    -iname " FILENAME" :不区分字母大小写

我们查找/etc/路径下名为passwd的文件,

wKiom1eyusqy30jNAAAmUF4vbpg278.png

            注意:当我们使用通配符进行查找时,为了防止shell以我们不期望的方式解释通配符,就必须用引号把搜索内容括起来。

wKioL1ey7l_CFYSmAAAV1amjToo232.png

    -inum N    按 inode 号查找

    -samefile FILENAME    相同 inode 号的文件

    -links N    链接数为 n 的文件

wKioL1eyvBzzYErHAAA7B41K30I723.png

    -regex "PATTERN"     以 PATTERN 匹配整个文件路径字符串,而不仅仅是文件名称

wKioL1eyvViz2OYDAAAr8iLAbhI554.png

3.2. 根据文件类型查找

    -type TYPE    根据指定文件类型查找文件,支持的文件类型有:

    •  f:  普通文件

    • d:  目录文件

    • l:  符号链接文件

    • s :套接字文件

    • b:  块设备文件

    • c:  字符设备文件

    • p:  管道文件


wKioL1eyv6CiX-ewAAA5OV2fpIU974.png

3.3. 根据属主属组查找

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

wKiom1eyzEvRG67jAACBCMEVCgk442.png

如上图看到,我们查找的是jacky用户,为什么出来的是zhaoqi用户的呢?我们再来看看jacky和zhaoqi的用户信息:

wKiom1eyzQGQM58xAAAcXmFHMCE658.png

由此我们可以知道,如果用户名A和用户B,UID相同,查找用户A的话,也能找到B用户的文件,find的用户查找是从系统角度出发,只认UID的。

3.4. 根据文件大小查找

    -size [+|-]#UNIT    常用单位: k, M, G

文件的大小,以指定数字的话(比如10M),一般有三种情况:大于10M、小于10M和等于10M。为了有助于理解,三种情况可以表示为下图:

wKioL1eyw5GQo8qpAAA2Kk2DQ0c448.png

wKioL1eyyC6wAFMpAABztkOlUo0172.png

3.5. 根据文件时间戳查找

     以“天”为单位的(#UNIT表示用数字指定的时间)

        -amin [+|-]#UNIT

        -mtime [+|-]#UNIT

        -ctime [+|-]#UNIT

     以“分钟”为单位的

        -amin [+|-]#UNIT

        -mmin [+|-]#UNIT

        -cmin [+|-]#UNIT

同样的,相对于指定时间,以7天为例,也有三种情况:小于7天、等于7天和大于七天。同样便于理解,以-atime为例示图如下:

wKioL1ey0_jg-QV8AAAmi8euCLU593.png

3.6. 根据权限查找

    -perm [/|-]MODE        (MODE表示以8进制数字表示的用户权限)

我们先创建如下文件进行权限查找演示:

wKiom1ey2HeQ1hiMAAAq0IHQdjw526.png

我们分别666、-222、/222、/200、-200和400查找:

wKiom1ey2eeCSBjDAABHO1EmKI0529.png

由示例可以看到:

    • -perm 666和-perm 400时,需要对应位权限精确匹配

    • -perm -222时,要求三个权限为都必须是2

    • -perm /222时,三个权限为任一有2就匹配

    • -perm /200和-perm -200时,0表示所在位权限不关心。

因此我们得出指定权限的结论

    • MODE精确权限匹配

    • /MODE任何一类 (u,g,o) 对象的权限中只要能一位匹配即可,是或关系,(+MODE从 centos7 开始淘汰)

    • -MODE :每一类对象都必须同时拥有指定权限,与关系0  表示不关注

3.7. 多条件查找&德摩根定律

find多条件查找时,各查找条件是按逻辑关系进行关联起来的。即 组合条件:

    • 与: -a

    • 或: -o

    • 非: -not, !


我们先创建7个文件:

wKioL1ezBmvAyieoAAAmG-D4Xjk113.png

示例一:各条件之间是默认存在-a(与)关系

wKiom1ezvo_xJ-wkAAAYYP8kHes525.png

示例二 :在一般情况下,-a(与) 的优先级高于-o(或),如果需要提高-o(或)优先级,则需要添加 \(  \) 把括起来。

wKioL1ezvwej0uVmAAAhfEEnoOI921.png

wKioL1ezv3mDA-oLAAASt-dj1u0009.png

示例三:包含a字符,并且 不包含b字符的文件,即 A -a ! B = ! \( A  -o B  \)

wKiom1ezwH3SIhWuAAAYkwfqDfc300.png

示例四:包含a字符,或者  不包含b字符的文件,即 A -o ! B = ! \( A  -a B  \)

wKiom1ezwLORq0JTAAAhXf3iwwk439.png

由示例三和示例四可以知道,find多条件间关系是符合德摩根定律的,即:


  • 非(A 且 B) = (非 A) 或 (非 B)

  • 非(A 或 B) = (非 A) 且 (非 B)


看了公式是否有些茫然?为了方便理解,我们来图解德摩根定律:

    • 与: -a            ===>且、并集

    • 或: -o            ===>或、交集

    • 非: -not, !     ===>非、补集

逻辑关系基础:

wKiom1ezxEfRzhYtAAIn2FT1meI738.png


wKioL1ezxRKTcZkUAAqwvhGxHWo458.gif

4. 动作处理

    -print:默认的处理动作,显示至屏幕;
    -ls:类似于对查找到的文件执行“ ls -l”命令
    -delete:删除查找到的文件;
    -fls file:查找到的所有文件的长格式信息保存至指定文件中
    -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令;对于每个文件执行命令之前,都会交互式要求用户确认

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

其中{} \;是固定格式,

    •         {}    用于引用查找到的文件名称自身

    •         \;    结束格式

wKiom1ezy8Tw_71jAAAnuG_40Eo276.png

从示例可知,-ok和-exec实现实现的功能都是一样的,区别在于-ok会进行交互要求用户确认,-exec直接操作。

结束语


如你所见,用find命令能够做很多事情。但find命令还能够完成更多的操作,所以真应该查看一下man find页面,或是在互联网上浏览一些相关的优秀教程。find是Linux系统中功能最强大的命令之一,请立即把它用起来吧。

由于初学Linux,限于本人水平有限,文中难免错误纰漏。欢迎各位不吝指教、讨论相关技术。谢谢。

联系我:jacky18676887374@aliyun.com

习题作业


1、查找/var目录下属主为root,且属组为mail的所有文件

[root@IP70-CentOS7 ~]# >>find /var -user root -group mail

1471432296631781.png

2、查找/var目录下不属于root、lp、gdm的所有文件

[root@IP70-CentOS7 ~]# >>find /var ! \( -user root -o -user lp -o -user gdm \)

1471432350491914.png

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

[root@IP70-CentOS7 ~]# >>find /var -mtime -7 ! \( -user root -o -user postfix \)

1471432526824375.png

4、查找当前系统上没有属主或属组,且最近一个周内曾被访问过的文件

[root@IP70-CentOS7 ~]# >>find / -atime -7 -nouser -nogroup

5、查找/etc目录下大于1M且类型为普通文件的所有文件

[root@IP70-CentOS7 ~]# >>find /etc -type f -size +1M -ls

1471433027760038.png

6、查找/etc目录下所有用户都没有写权限的文件

[root@IP70-CentOS7 ~]# >>find /etc ! -perm /222

1471433142494552.png

7、查找/etc目录下至少有一类用户没有执行权限的文件

[root@IP70-CentOS7 ~]# >>find /etc ! -perm -111

1471433310828203.png

8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户有写权限的文件

[root@IP70-CentOS7 ~]# >>find /etc/init.d  -perm -113

1471433518823359.png

原创文章,作者:昭其,如若转载,请注明出处:http://www.178linux.com/36963

(1)
昭其昭其
上一篇 2016-08-18 13:48
下一篇 2016-08-18 15:20

相关推荐

  • N26-第九周作业-邢岩

    马哥门徒-N26-邢岩 相信自己、勤奋努力、不断总结!shell脚本练习需要重复、重复、再重复!那么,我就继续来写、写、写。 1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #******************************…

    Linux干货 2017-04-03
  • N_28包管理器(rpm)及前端管理工具(yum)

    1、简述rpm与yum命令的常见选项,并举例 rpm–>RPM package manager 是一种用于redhat发行版的打包及安装管理工具,现在成为linux领域包管理器的行业标准,包名以.rpm为后缀。 用法: rpm [options] PACKAGE_FILE 常用选项: -i:安装rmp包 -v:显示安装过程 -vv:更加详细…

    Linux干货 2018-01-01
  • 第一周 Linux基础知识

    Linux基础

    2018-03-18
  • httpd功能配置之路径别名

       httpd的路径别名功能可以使用资源的访问不再依赖于站点的根目录,可以指定任意目录来设置资源的访问路径。    默认站点的根目录是/var/www/html,如下图所示。    下面来使用路径的别名来访问资源:    1、打开httpd服务的配置文件  &nbsp…

    Linux干货 2016-03-11
  • 学习新技术的10个建议

    我们生活在一个振奋人心的时代。我们可以越来越方便廉价地获得大量学习资源。这些资源的传播载体由最初的教室被变成了博客,技术论坛等。坐拥如此众多的学习资源,我们没有任何理由不去好好利用。随之而来的问题便是如何在这知识的海洋中选择自己的前进方向。在这篇文章中,我将简要概括一些技术学习的建议,希望可以给你带来一些启发。 尽管我的建议主要涉及的是软件开发方面,但是这些…

    Linux干货 2015-03-20
  • Nginx常用配置详解

    Nginx常用配置详解(一) 本文依照nginx官方站点文档介绍常用的nginx各种常用配置,未经过校对,如有错误还望海涵。 Nginx配置通用语法 Nginx最基本的配置语法 配置项名 配置项值1 [配置项值2 ….]; 配置项名位于行首,配置项值与配置项名之间用空格隔开,多个配置项值之间也用空格隔开,每行配置结尾必须加上分号。 #配置项名 配置项值1…

    Linux干货 2017-06-20

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-19 15:15

    一如既往的好,有自己的思考与总结。