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

相关推荐

  • Shell 变量类型及用法

    一、      什么是变量          变量源于数学,在计算机语言中能储存计算机结果或能表示值的抽象概念,变量可以由变量名访问,在指令语言中,变量通常是可变的。Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个…

    Linux干货 2016-08-12
  • MySQL流程函数

    MySQL流程函数 IF(value,x y) 如果value是真,返回x,否则返回y MariaDB [learn]> INSERT INTO salary(sal) VALUES (1000),(2000),(3000),(4000),(5000),(6000),(NULL); Query OK, 7 rows affected (0.06 sec…

    Linux干货 2017-05-02
  • Linux基本知识之echo命令详解

    该博文以CentOS6.8_x86_64系统为基础,Xshell使用pts/X终端登录CentOS6.8系统,以root身份登录系统。 为什么学习echo命令?     echo是一种最常用的与广泛使用的内置于Linux的bash和C shell的命令,通常用在脚本语言和批处理文件中来在标准输出或者文件中显示一行文本或者字符串。…

    Linux干货 2016-07-29
  • 手动自制Mini Linux

        linux系统内核非常的精简,而且基于一切皆文件的思想,使得我们可以再现有系统上挂载一个空硬盘,利用现有系统编译一个内核和相关程序文件并拷贝到空硬盘上。我们就可以用空硬盘来单独运行一个精简的linux系统,这对于依赖于注册表的windows系统来说是不可能实现的。本文简要介绍一下一个mini linux的安装制…

    Linux干货 2016-05-03
  • linux系统基础目录结构及功能说明

    linux系统基础目录结构及功能说明 [root@localhost /]# ls bin boot dev etc home host lib lib64 media mnt opt proc root run sbin srv sys tmp usr var /bin:所有用户可用的基本命令程序文件;/sbin:供系统管理使用的工具程序;/boot:引导…

    Linux干货 2018-03-04
  • Net25 第二周作业

    一、Linux上的文件管理类命令,其常用的使用方法和相关示例 1、ls:查看文件与目录 作用:ls命令用于显示目录内容,类似于DOS下的dir命令,它的使用权限是所有用户。 用法:ls [选项]…[文件]… 主要选项如下: -a:全部的文件,连同隐藏文件(开头为 .的文件)一起列出来 -A:列出全部的文件(连同隐藏文件,但不…

    系统运维 2016-12-11

评论列表(1条)

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

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