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的文件,

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

      -inum N    按 inode 号查找

    -samefile FILENAME    相同 inode 号的文件

      -links N    链接数为 n 的文件

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

    3.2. 根据文件类型查找

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

      • f:  普通文件
      • d:  目录文件
      • l:  符号链接文件
      • s :套接字文件
      • b:  块设备文件
      • c:  字符设备文件
      • p:  管道文件

    3.3. 根据属主属组查找

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

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

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

    3.4. 根据文件大小查找

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

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

    3.5. 根据文件时间戳查找

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

            -amin [+|-]#UNIT

            -mtime [+|-]#UNIT

            -ctime [+|-]#UNIT

    以“分钟”为单位的

            -amin [+|-]#UNIT

            -mmin [+|-]#UNIT

            -cmin [+|-]#UNIT

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

    3.6. 根据权限查找

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

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

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

    由示例可以看到:

      • -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个文件:

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

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

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

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

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

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


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

      • 与: -a            ===>且、并集
      • 或: -o            ===>或、交集
      • 非: -not, !     ===>非、补集

    逻辑关系基础:


    4. 动作处理

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

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

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

      •    {}    用于引用查找到的文件名称自身
      •   \;    结束格式

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

    结束语



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

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

    联系我:[email protected]

    时间: 2024-08-11 17:28:29

    find文件:就是这么简单的相关文章

    多文件上传简单实现

    五一假期后的第一天上班,无聊,做了一个简单的多文件上传,如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; usin

    MySQL 物理文件体系结构的简单整理说明

    本文出处:http://www.cnblogs.com/wy123/p/7102128.html (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 本文的数据库版本是MySQL5.7.18,简单介绍一下MySQL数据文件目录的物理结构和作用,从中可以窥见MySQL的整体上的物理文件结构以及逻辑功能.可以从整体结构上了解到MySQL的物理体系架构(本人学习的思路往往是被与已了解的事物对照学习,或者快速了解其轮廓,再逐步细

    Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门

    说明: Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代表用户的请求. ServletResponse – 代表用户的响应. 本篇博客讲解: ServletRequest – 代表用户的请求. ServletResponse – 代表用户的响应. 表单中的多选框参数接收. 文件的上传技术. ServletRequest : ServletRequest

    如何用Java来进行文件切割和简单的内容过滤

    一 由来 去年由于项目的需求,要将一个任意一个文件制作成一个xml文件,并且需要保持文件内容本身不产生变化,并且还要能够将这个xml还原为原文件.如果小型的文件还好处理,大型的xml,比如几个G的文件,就很难直接从节点中提取了.所以我来我们采用了以文件流的方式.于是有了这个文件的裁剪工具. 二 使用场景 本工具可能的使用场景: 1.对任一文件的切割/裁剪.通过字节流的方式,开始节点和终止节点,裁剪出两个节点之间的部分. 2.往任一文件的头/尾拼接指定字符串.可以很容易将一个文件嵌入在某一个节点中

    QT 读取文件夹下所有文件(超级简单的方法,不需要QDirIterator)

    之前,用标准C++写过读取文件夹.现在用QT重写代码,顺便看了下QT如何实现,还是相当简单的.主要用到QDir,详细文档可见这里 A program that lists all the files in the current directory (excluding symbolic links), sorted by size, smallest first: ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 #in

    PHP 关于文件操作的简单介绍

    文件操作一直是Web程序员头疼的地方,而文件操作在CMS这样的系统中又是必须的.如今,PHP文件操作的函数内容已经非常强大,文件这部分也是学习PHP非常重要的一部分,希望大家不要忽略.这篇文章会简单介绍一下PHP的几个基本文件操作,最后附有PHP文件函数汇总,供大家参考和学习. 1. 打开文件:fopen("文件名","模式"); 模式参数: r:只读,将文件指针指向文件头. r+:读/写,将文件指针指向文件头. w:只写,打开并清空文件的内容.如果文件不存在,则创

    Qt之课外实践——文件操作(简单清道夫)

    说明:这个小项目是关于文件操作的.主要的功能有:重复文件的查找(根据文件的大小),说白了,就是讲大小相同的文件在一起显示出来,供用户自由的选择删除.这个360云盘里的文件去重还差的很远.还有空文件夹的查找(我们的思想是:如果一个目录下面只有.和..2个目录,则,这个文件夹就是空的.但是我们不包含文件里面套有空文件夹.),以及垃圾文件的查找(根据文件的后缀,简单判断的.). 窗体主界面: 首先程序运行前,会弹出提示对话框. 代码如下: mainwindow.h #ifndef MAINWINDOW

    JavaScript,php文件上传简单实现

    非ajax,非iframe,最原始使用file控件的文件上传,记录过程备忘. 实现目标,能够将文件上传到指定位置. 客户端用input的file控件: <form action='data.php' method='post' enctype='multipart/form-data'> <input type='file' name='file' /> <input type='submit' /> </form> 控件的name属性就是为了和服务器端通信

    网站目录文件权限的简单安全设置

    网站目录文件权限的设置对网站的安全至关重要,下面简单介绍网站目录文件权限的基本设定. 我们假设http服务器运行的用户和用户组是www,网站用户为centos,网站根目录是/home/centos/web. 1.我们首先设定网站目录和文件的所有者和所有组为centos,www,如下命令: chown -R centos:www /home/centos/web www.2cto.com 2.设置网站目录权限为750,750是centos用户对目录拥有读写执行的权限,这样centos用户可以在任何

    python2.7入门---文件I/O&amp;简单用户交互

        这篇文章开始之前,我们先来看下python中的输出方法.最简单的输出方法是用print语句,你可以给它传递零个或多个用逗号隔开的表达式.此函数把你传递的表达式转换成一个字符串表达式,并将结果写到标准输出如下: #!/usr/bin/python # -*- coding: UTF-8 -*- print "Python 是一个非常棒的语言,不是吗?"     我们的的标准屏幕上会产生以下结果: Python 是一个非常棒的语言,不是吗?     然后呢,我们来看个比较有意思的两