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

相关推荐

  • Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示

    目录与路径 相对路径与绝对路径 绝对路径:路径的写法【一定由根目录 / 写起】 /usr/share/doc 这个目录。 相对路径:路径的写法【不是由 / 写起】 由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: 【cd ../man】这就是相对路径的写法。相对路径意指相对于当前的工作目录 cd (切换目录) . &n…

    Linux干货 2016-11-06
  • 第四周 N28 (用户及权限管理及BRE、ERE应用)

    1、复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限。 # cp -r /etc/skel /home/tuser1 # chmod -R og= /home/tuser1 2、编辑/etc/group文件,添加组hadoop。 hadoop:x:1000: 3、手动编辑/etc…

    2017-12-22
  • 集中练习1-10个Linux运维脚本

    用户管理、文本处理、文件管理相关

    2017-09-20
  • linux用户管理(一)

    作为一个专业的服务器发行版,CentOS上存在着n多个用户,作为一个专业的运维工程师,linux的用户管理和用户组的管理是做为一个SA必不可少的工作. 下面我们就先来谈谈linux中的用户管理: useradd可以在系统中新建一个用户 用法如下: useradd [选项] 用户名 常用选项: -u 指定用户的UID -g 指定用户的初始组ID -G…

    Linux干货 2017-04-03
  • 软件包管理

    软件运行与编译过程:程序源代码——预处理——-编译——-汇编——-链接 静态编译:.a 动态编译:.so 二进制程序的组成:二进制文件、库文件、配置文件、帮助文件。 包的命名:1、源代码:name -VERSION.tar.gz或bz2或xz   &nb…

    Linux干货 2017-04-23
  • Linux的终端类型

         序  终端的概念是由Ken Thompson提出的,是人机交互的接口。它是一种字符型设备,有多种类型,它大体上分为设备终端,物理终端,虚拟终端,图形终端,串行终端,伪终端。 一、   设备终端  设备终端就是显而易见的外在设备,比如键盘、鼠标和显示器等。 二、&nbsp…

    Linux干货 2016-10-19

评论列表(1条)

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

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