大家好,我是肖邦,这是我的第 10 篇原创文章。

在 Linux 系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过 200M 文件,查看近 7 天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求 find 命令都可以轻松胜任。


在 Linux 系统文件中常用的属性可以分为以下内容:名称、大小、权限、属主、修改时间、访问时间等,find 命令可以按照指定的属性为条件进行查找。

废话不多,直接开干,下边进入案例实战。

案例实战

(一)按文件名称查找

按照文件名称查找是 find 最常见的用法,需要注意的是,搜索的文件名必须完全匹配,才能找到对应的文件。

1. 查找当前目录下所有 go 文件

$ find . -name "*.go"

2. 在 etc 目录下,查找大写字母开头的 txt 文件

$ find /etc -name "[A-Z]*.txt" -print

3. 在当前目录下查找不是 out 开头的 txt 文件

$ find . -name "out*" -prune -o -name "*.txt" -print

4. 在当前目录除 git 子目录外查找 txt 文件

$ find . -path "./git" -prune -o -name "*.txt" -print

5. 找出某个文件的所有硬链接,ls 命令 -i 选项可以查看文件的 inode 号

$ ls -i 1.txt
138956 1.txt
$ find . -num 138956

这里补充一个小技巧,搜索文件时使用 -iname 参数可以忽略文件名称大小写

(二)按文件类型查找

1. 在当前目录下,查找软连接文件

$ find . -type l -print

2. 在当前目录下,查找 log 结尾的普通文件,f 表示普通文件类型

$ find . -type f -name "*.log"

(三)按文件大小查找

1. 查找小于 64k 的文件

$ find . -size -64k -print

2. 查找大小超过 200M 的文件

$ find . -size +200M -type f -print

(四)按时间查找

1. 查找 2 天内被修改过的文件

$ find . -mtime -2 -type f -print

2. 查找 2 天前被更改过的文件,-mtime 表示内容修改时间

$ find . -mtime +2 -type f -print

3. 查找一天内被访问的文件,-atime 表示访问时间

$ find . -atime -1 -type f -print

4. 查找一天内状态被改变的文件,-ctime 表示元数据被变化时间

$ find . -ctime -1 -type f -print

5. 查找比 chopin.txt 新的文件

$ find . -newer "chopin.txt" -type f -print
$ find . ! -newer "chopin.txt" -type f -print # 旧

(五)根据权限查找

1. 查找当前目录权限为 644 的文件

$ find . -type f -perm 644

2. 查找 etc 目录下至少有一个用户有写权限的文件

$ find /etc -type f -perm /222

3. 查找 etc 目录下所有用户都有执行权限的文件

$ find /etc -perm -111 -ls

(六)组合条件

1. 查找当前目录下属于 chopin 用户的普通文件,-a 可以省略

$ find . -type f -a -user chopin -print

2. 查找当前目录下大于 2M 或 2 天前被修过的文件

$ find . -size +2M -o -mtime +2 -print

3. 查找当前目录下不是普通文件

$ find . -not -type f
$ find . ! -type f

4. 查找非空文件

$ find . ! -empty

(七)处理动作

find 根据上述各种条件查找后,支持执行相关的处理动作,可以让我们的更方便和灵活,而不只是打印出来

1. -print 默认为打印,可省略

$ find . -name "*.log" -print
$ find . -name "*.log" # 等价

2. -ls 以 ls 长文件的格式形式输出

$ find . -name "*.txt" -ls
138957      4 -rw-r--r--   1 root     root           16 Jan 24 23:20 ./a.txt
138959      4 -rw-r--r--   1 root     root          172 Jan 24 13:06 ./T.txt
138956      4 -rw-r--r--   1 root     root           27 Jan 24 23:28 ./1.txt

3. -delete 删除查找到的文件

$ find . -size +100M -delete

4. -exec 将查找到的文件传递给 command 命令。下边例子是将查找到的文件传递给了 ls 命令,同理我们可以传递给任何一个 Linux 命令,功能十分强大,也很灵活。

$ find . -name "*.txt" -exec ls -lh {} \;
-rw-r--r-- 1 root root 16 Jan 24 23:20 ./a.txt
-rw-r--r-- 1 root root 172 Jan 24 13:06 ./T.txt
-rw-r--r-- 1 root root 27 Jan 24 23:28 ./1.txt

5. -ok-exec 功能一样,只是操作时会提示用户确认,仅此而已。当然,在生产环境上,我们还是推荐使用 ok

(八)经典案例

如果存在一个名称乱码的文件,想要删除它,该怎么办?即使我们复制乱码名称到命令行,很有可能终端不能正确识别。不用担心,下边来展示下 find 是如何优雅的解决问题的。

$ ls  -i
138957 a.txt  138959 T.txt  132395 ڹ��.txt

$ find . -inum 132395 -exec rm {} \;

命令中,-inum 指定的是文件的 inode 号,它是系统中每个文件对应的唯一编号,find 通过编号找到后,执行删除操作。

总结归纳

find 命令是 Linux 命令中最有用的命令之一,它的功能非常强大,且语法复杂。其实我们不一定需要了解它的所有细节,掌握上述实战案例中的常见用法,足够满足日常工作中的大部分需求。

下边我们一起来总结下 find 命令常见用法,加深对 find 使用方法的理解。

命令格式

find path -option [-exec ...]

按文件名查找

  • -name:按照文件名称查找,准确匹配;
  • -iname:不区分文件名的大小写;
  • -inode:按照文件 inode 号查找;

按照文件类型查找

按照文件类型查找,可以使用 -type 选项,具体支持的文件类型如下:

  • f:普通文件
  • d:目录文件
  • l:链接文件
  • s:套接字文件
  • p:管道文件
  • b:块设备文件,比如:磁盘
  • c:字符设备文件,比如:键盘、鼠标、网卡

按照文件从属关系查找

  • -user:以用户名查找
  • -group:以组名查找
  • -uid:以用户 ID 查找
  • -gid:以组 ID 查找
  • -nouser:查找没有属主的文件
  • -nogroup:查找没有属组的文件

按照文件大小查找

按照文件大小查找功能十分常用,用 -size 选项,选项后边指定大小 1024M,表示大小的格式有如下几种:

  • -5M:查找小于 5M 的文件
  • +5M:查找大于 5M 的文件
  • 5M:查找大小为 5M 的文件

单位支持的有 c(字节)kMG 等,需要注意的是默认单位并不是字节,而是 b,大小为 512 字节。

按照时间查找

按照时间查找的功能对系统管理员来说,十分常用,find 支持如下几种时间类型:

  • atime:以访问时间查找
  • mtime:以数据修改时间查找
  • ctime:以元数据修改时间查找
  • newer:以文件为条件,判断比它新的文件

按时间查找时,使用格式如下:

  • -atime -5:表示 5 天内访问过的文件;
  • -atime +5:表示 6 天前访问过的文件;
  • -atime 5:表示前 5-6 那一天访问的文件;

这个 +5 含义总是被人理解错,误认为是 5 天后修改的文件,如果能知道未来 5 天的事情,小编早就去买彩票了!可能这么说还不是很清楚,直接看图吧!


find 不仅可以按 为单位来查找文件,可以按照 aminmmincmin 来查找,区别只是 min 选项单位为分钟。

按照权限查找

按权限查找是通过 -perm 选项,可以按照如下方式使用:

  • -perm 644:精确权限查找
  • -perm /666:任何一类用户中的任何一位符合条件即满足
  • -perm -222:每一类用户的每一位同时符合条件即满足

组合条件

find 可以使用多个条件的组合,支持 -a-o-not!,比较简单,不再详细描述其含义。

处理动作

find 根据各种条件查找后,支持执行相关的处理动作,可以让我们的更方便和灵活,而不只是打印出来。

  • -print:打印,默认动作,可省略
  • -ls:以 ls 长文件格式输出
  • -delete:删除查找到的文件
  • -exec:查找到的文件传递给任何 Linux 命令
  • -ok:与 exec 功能相同,区别是需要用户确认每次的操作

再啰嗦一下,find 命令支持的参数和选项比较多,文中只是总结出最常用、核心的参数选项。如果上述命令确实不满足需求,可以请教你的男人 man find

这里需要提一下,find 搜索文件时通过扫描磁盘来进行的,尽可能不要大范围的搜索文件,尤其是在 / 目录下搜索,会长时间消耗服务器的 cpu 资源。如果是生产环境的机器,执行前要考虑是否会对业务造成影响。

扩展 locate

虽然 find 功能非常强大,但要知道的是,find 执行过程是通过扫描磁盘文件来进行查找的,如果大范围的查找文件,需要花费的时间很长,且消耗服务器 cpu 资源。

这里推荐另一个 Linux 文件查找神器 locate,类似于 win 平台下的 everything。它基于索引表进行查询,查询速度非常快,基本不占用 cpu 资源。

使用方法非常简单

$ locate file.txt
$ locate /etc/httpd

需要注意,如果是当天新创建的文件,通过 locate 默认是查不到的,因为它的数据库默认是每天自动更新一次。如果希望查询到当天创建的新文件,需要执行 updatedb 即可。

查找速度快是 locate 的优势,但它的缺点也非常明显:

  • 模糊查询
  • 查找匹配模式单一
  • 查询的名称匹配路径命令
  • 索引表的建立会占用磁盘空间
  • 非实时查询,当天数据可能查不到

好了,到这里关于 find 命令的全部内容已经结束,希望文中的案例和总结能够帮助你更好的使用它。同时也强烈建议收藏本文,以作为 Linux 常用命令手册。

好了,本次分享就到这里了!谢谢大家,我是肖邦,欢迎关注后续的精彩内容。

推荐阅读:


Linux 文件搜索神器 find 实战详解,建议收藏!的更多相关文章

  1. Java线程同步的四种方式详解(建议收藏)

    ​ Java线程同步属于Java多线程与并发编程的核心点,需要重点掌握,下面我就来详解Java线程同步的4种主要的实现方式@mikechen 目录 什么是线程同步 线程同步的几种方式 1.使用sync ...

  2. Linux文件排序工具 sort 命令详解

    sort是排序工具,它完美贯彻了Unix哲学:"只做一件事,并做到完美".它的排序功能极强.极完整,只要文件中的数据足够规则,它几乎可以排出所有想要的排序结果,是一个非常优质的工具 ...

  3. Linux 网络分析必备技能:tcpdump 实战详解

    大家好,我是肖邦,这是我的第 11 篇原创文章. 今天要分享的是 tcpdump,它是 Linux 系统中特别有用的网络工具,通常用于故障诊断.网络分析,功能非常的强大. 相对于其它 Linux 工具 ...

  4. Linux 三剑客之 awk 实战详解教程

    我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...

  5. Linux中用postfix搭建邮件服务器实战详解

    Linux中用postfix搭建邮件服务器实战详解 postfix是Wietse Venema在IBM的GPL协议之下开发的MTA(邮件传输代理)软件.Postfix试图更快.更容易管理.更安全,同时 ...

  6. linux dd命令参数及用法详解---用指定大小的块拷贝一个文件(也可整盘备份)

    linux dd命令参数及用法详解---用指定大小的块拷贝一个文件 日期:2010-06-14 点击:3830 来源: 未知 分享至:            linux dd命令使用详解 dd 的主要 ...

  7. 【转】段错误调试神器 - Core Dump详解

    from:http://www.embeddedlinux.org.cn/html/jishuzixun/201307/08-2594.html 段错误调试神器 - Core Dump详解 来源:互联 ...

  8. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

  9. linux sed命令参数及用法详解

    linux sed命令参数及用法详解 http://blog.csdn.net/namecyf/article/details/7336308 1. Sed简介 sed 是一种在线编辑器,它一次处理一 ...

随机推荐

  1. 阿里巴巴java开发手册-嵩山版 下载

    引言 今天阿里巴巴开发手册嵩山版又发布了,距离上次泰山版发布才仅仅几个月.是不是有的同学又要感叹下这速度也太快了点吧.我泰山版还没看完,嵩山版直接来了.没看完不要紧,我们直接看嵩山版本就好了.一次性把 ...

  2. Java Tree 树 数据结构

    说到树结构就不得不回顾 链表结构 https://www.cnblogs.com/easyidea/p/13371863.html 如果链表结构中再多一个指针会是什么情况? 是不是像树根一样,这就是 ...

  3. 对CAS中atomicInteger实现的思考

    p.p1 { margin: 0; font: 11px Monaco } span.s1 { color: rgba(147, 26, 104, 1) } span.s2 { color: rgba ...

  4. CyclicBarrier(栅栏)的用法详解及与countDownLatch用法区别

    CyclicBarrier适用于这样的情况:你希望创建一组任务,它们并行的执行工作,然后在进行下一步步骤之前等待,直至所有任务都完成,它使得所有的并行任务都将在删栏出列队,因此可以一致的向前移动. 当 ...

  5. Redis基础篇(七)哨兵机制

    上一篇文章介绍了高可靠方案:主从集群模式.通过主从库的读写分离,来保证服务的可靠性. 当某个从库出现故障时,不影响服务的使用,主库仍然可以处理写命令,其他从库可以处理读命令.但主库发生故障,就不能处理 ...

  6. LeapMotion控制器 java语言开发笔记--(连接控制器)

    (1)为了连接LeapMotion控制器,创建controller对象,这个对象自动创建与控制器的服务或者后台程序连接,然后捕获数据提供给你的应用程序.可以使用该对象来获取连接信息. (2)获取Fra ...

  7. 2021年了,C 语言会被淘汰吗?

    一年365天,总有那么几百天听到有人说"C语言过时了""C语言要被时代淘汰了",那么真的会被淘汰吗? C 语言发布于 1972 年,到2021年已经有49年的历 ...

  8. 双重校验锁 --使用volatile和两次判空校验

    介绍 双重校验锁是单例模式中,饿汉式的一种实现方式.因为有两次判空校验,所以叫双重校验锁,一次是在同步代码块外,一次是在同步代码块内. 为什么在同步代码块内还要再检验一次? 第一个if减少性能开销,第 ...

  9. Head First 设计模式 —— 08. 外观 (Facade) 模式

    思考题 想想看,你在 JavaAPI 中遇到过哪些外观,你还希望 Java 能够新增哪些外观? P262 println.log 日志接口.JDBC 接口 突然让想感觉想不出来,各种 API 都用得挺 ...

  10. Go GRPC 入门(一)

    前言 微服务相关 使用 GRPC 通讯的 Golang 微服务入门 举例写一个微服务,接收网址发送请求获取返回结果返回 正文 安装工具 安装 protobuf 这是 proto 文件的编译器 点我下载 ...