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

相关推荐

  • 第三周作业

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost /]# who | cut -d ‘ ‘ -f 1  | sort -u root user1 或: [root@localhost /]# who | cut -d ‘ ‘ -…

    Linux干货 2017-02-24
  • N25 – 第二周博客作业

      Linux上的文件管理类命令有哪些,其常用的使用方法及相关示例演示 more: more命令非常简单,只用more file即可,但是more命令有一个特点,就是翻屏至文件尾部后自动退出 less: less命令就是在使用man时是一样的,因为man手册就是调用less来查看的  head: head命令用来查看文件的前#行,#默认为…

    Linux干货 2016-12-07
  • Linux磁盘分区创建及bash 简单应用

    1、创建一个10G分区,并格式为ext4文件系统; (1)要求其block大小为2048,预留空间百分比为2,卷标为MYDATA,默认挂载属性包含acl; (2)挂载至/data/mydata目录,要求挂载是禁止程序自动运行,并且更新文件的访问时间戳; [root@danry ~]# fdisk /dev/sdb Welcome to fdisk (util…

    2017-09-11
  • SELinux

    软件的安全性 提高软件的安全性 选择安全系数较高的系统 提高现有系统的安全性 计算机的安全等级 D:最低的安全级别,提供最少的安全防护,系统访问无限制。DOS C:访问控制的权限,能够实现可控的安全防护,个人账户管理,审计和资源隔离 Unix Linux windowNT B:支持多级安全,通过硬件对安全数据进行保护 A:最高级别,提供验证设计,要求数据从生…

    Linux干货 2017-05-21
  • Linux各发行版、哲学思想、基础目录

    Linux发行版本? Linux操作系统的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Redhat(RHEL)为代表,后者以Debian为代表。               R…

    Linux干货 2016-10-26
  • jenkins+gitlab构建安卓自动编译环境

        因工作关系接触到接触到安卓自动编译环境,网上的资料都推荐了jenkins,因为第一次接触安卓和jenkins,踩了不少的坑,有总结才有进步。    gitlab环境之前已经安装完成可用,具体步骤另外详解吧。本例目标是在gitlab可用前提下,通过jenkins将git仓库的代码自行编译打包,生成可用的apk安装…

    Linux干货 2016-07-16

评论列表(1条)

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

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