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
下一篇 2016-08-18

相关推荐

  • Bash脚本写法及变量如何使用

    Bash是什么? bash脚本是作为linux执行与内核交互的一个方便快捷的脚本语言工具。它可以帮助我们快速的解决问题。 Bash写法: 需要创建一个文件,以.sh结尾。这样就生成一个脚本文件 我们文件内容开头要以#!/bin/bash 开头,这是脚本规定的格式,目的是告诉编译器我们这个脚本是bash类型的脚本。 当上述工作都做好以后,我们就可以正式开始脚本…

    Linux干货 2017-04-10
  • Linux简述

    计算机诞生                                                  …

    2017-03-18
  • Linux基础目录名称及功用

    FHS目录规则 Filesystem Hierarchy Standard(文件系统目录标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。   FHS定义了两层规范,第一层是,…

    Linux干货 2016-10-30
  • 【招聘福利】上海/北京/深圳丨 云络科技丨招募linux系统运维工程师

    岗位要求: 1,安装服务器 – Linux CentOS + netinstall 2.服务器安全 – 用户、权限、iptables、sudo 3.计划部署Linux?高可用性,包括HA,LB 4.协助Leader完成复杂的网络设计 (完全冗余/故障迁移/高可用性) 5.用linux命令查看服务器(top/iostat/vmstat/sar/等) 6.安装、…

    Linux干货 2016-04-05
  • 毕业即高薪只是别人家的好事吗?

    1 毕业即高薪?运气?梦想?还是嘘头?  同学们,你还在担心毕业后不好找工作吗,毕业即高薪只是别人家的好事吗?马哥linux又一名在校生学员毕业即20w+高薪名企,你还在等什么呢? 真的只是梦想么?还是只存在于别人家的公司? 越来越多的在校大学生凭着强烈的上进心踊跃的加入了马哥linux的学习阵营,这名研究生同学在研究生毕业的同时也从马哥linux…

    2015-09-06
  • bash代码注入的安全漏洞

           很多人或许对上半年发生的安全问题“心脏流血”(Heartbleed Bug)事件记忆颇深,这两天,又出现了另外一个“毁灭级”的漏洞——Bash软件安全漏洞。这个漏洞由法国GNU/Linux爱好者Stéphane Chazelas所发现。随后,美国电脑紧急应变中心(US-CERT)、红帽以及多家从事安全的公…

    Linux干货 2015-03-30

评论列表(1条)

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

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