Linux/Unix 中的 find 命令及示例

17 Mar 2025 | 6 分钟阅读

find 命令可以帮助我们在目录中查找特定文件。它用于根据权限、用户所有权、修改时间、日期/时间、大小等各种条件查找文件列表。

在类 Unix 和其他操作系统中,find 命令是一个命令行实用程序,它根据用户指定的格式查找文件,然后打印所有匹配对象的文件名,或者,如果请求了其他操作,则对所有匹配对象执行该操作。

它从一个期望的起始位置开始搜索,然后递归地遍历分层结构(通常是树)的目录(节点)。find 命令可以搜索和遍历单个或多个存储设备上属于起始目录下的不同文件分区系统。

搜索格式包含一个用于与文件名匹配的模式,或一个用于与修改时间或文件访问时间匹配的时间范围。find 命令默认提供当前工作目录下的所有文件列表。但是,用户可以根据需要限制搜索从起始目录开始的最大层级。

相关的 locate 程序使用 find 命令生成的索引文件数据库,提供了一种通过名称快速搜索整个文件系统的技术。

find 工具随大多数 Linux 发行版 默认提供,因此我们无需安装任何其他软件包。它是 Linux 系统中最基本和常用的命令之一。

有两个选项决定 find 应如何处理符号链接。默认情况下,它从不跟踪符号链接。标志,即 -L,将使 find 跟踪符号链接。标志,即 -H,将仅跟踪符号链接,同时继续处理命令行参数。这些标志在 find 命令的 POSIX 标准中进行了规定。一个基本的扩展是标志,即 -P,用于显式禁用符号链接跟随。

至少需要一个路径来预测表达式。find 命令可以内部解释通配符,并且命令必须仔细引用以处理 shell 的通配符匹配。

表达式的组成部分由命令行参数边界分隔,通常在 shell 语法中用空格表示。它们从左到右进行评估。它们可以包含逻辑组件,如 OR 和 AND,以及谓词(操作和过滤器)。GNU find 包含许多 POSIX 未提及的其他功能。

以下符号用于指定目录

(.) : 表示当前目录名

(/) : 表示根目录

Find 命令的简要历史

find 命令出现在 Version 5 Unix 中,作为 **Programmer's Workbench** 项目的一部分,由 **Dick Haight** 与 cpio 一起指定,cpio 是为了配合使用而开发的。

最初,find 命令的 GNU 实现由 **Eric Decker** 指定。后来,由 **David MacKenzie、Tim Wood** 和 **Jay Plett** 开发。find 命令也已移植到 IBM i OS。

谓词

常用的主要选项是

  • -name pattern: 检查文件名是否与给定的 shell-glob 模式匹配。
  • -type type: 检查文件是否为指定的类型。
  • -print: 始终返回 true。它会将当前文件名和换行符打印到 stdout。
  • -print0: 始终返回 true。它会将当前文件名和空字符打印到 stdout。POSIX 没有此要求。
  • -exec program [argument ...];: 始终返回 true。它会执行一个程序,并带有固定的给定参数和当前文件路径。
  • -exec program [argument ...] { } +: 始终返回 true。它会执行一个程序,并带有固定的给定参数,并将尽可能多的路径作为参数。对于几乎所有实现,其他 {} 出现意味着给定名称的额外副本(此方面不是 POSIX 所需的)。
  • -ok program [argument ...];: 与 -exec 相同,但如果程序返回 0,则返回 false 或 true。

如果表达式中没有使用 -ok、-exec、-print 或 -print0,find 默认会在条件为 true 时执行 -print。

运算符

运算符增强了 find 命令的表达式。它们按降序优先级列出

  • ( expr ): 此运算符可以强制指定优先级。
  • ! expr: 如果 expr 返回 false,则返回 true。
  • expr1 expr2 (或 expr1 -a expr2 : AND。如果 expr1 为 false,则不评估 expr2。
  • expr1 -o expr2 : OR。如果 expr1 为 true,则不评估 expr2。

find 命令示例

让我们来看 find 命令的以下示例

按名称查找文件

我们可以搜索所有以 '.txt' 扩展名结尾的文件。要做到这一点,请执行以下命令

上面的命令将列出当前工作目录中的所有文本文件。请看下面的输出

Linux Find

从上面的输出中,所有带有 '.txt' 扩展名的文件都已通过 find 命令列出。

按类型查找文件

'-type' 参数用于指定文件类型。

一些文件类型如下

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

考虑以下命令:

上面的命令将列出所有以 '.bak' 扩展名结尾的目录。请看下面的输出

Linux Find

从上面的输出中,命令 "find . -type d -name "*.bak"" 显示了所有以 '.bak' 结尾的目录。

查找较新文件

'-newer' 参数有助于搜索比指定文件更新的文件。请看下面的命令

上面的命令将显示当前工作目录中所有比 ' msg.txt' 新的文件。请看下面的输出

Linux Find

从上面的输出中,所有显示的文件都比 'msg.txt' 文件新。

查找并删除文件

'-delete' 选项用于删除特定文件。在使用此命令时,我们需要非常小心,因为一旦执行,就没有撤销选项。请看下面的命令

上面的命令将从当前工作目录中删除 'Demo.txt' 文件。请看下面的输出

Linux Find

查找目录

'-type -d' 选项用于查找目录。请看下面的命令

上面的命令将查找 'Newdirectory' 的位置。请看下面的输出

Linux Find

按修改时间查找文件

'-mtime' 选项后跟天数,用于按修改时间查找文件。天数可以是正数或负数。负值用于小于,例如 -1 用于 last day,类似地,+1 会查找一天之前的文件。请看下面的命令

上面的命令将查找在 last day 内修改过的文件。请看下面的输出

Linux Find

按权限查找文件

'-perm' 选项用于按权限查找文件。执行带有 '-perm' 选项的 find 命令,并传入所需的值。请看下面的命令

上面的命令将列出指定目录中所有人都可以读取、写入和执行的文件。

查找并替换文件

要查找和替换文件,我们需要将 find 命令与 sed 命令结合使用。要操作文件,请在 find 命令中使用 '-exec' 选项。请看下面的命令

从上面的命令中,指定的出现将得到替换。请看下面的输出

Linux Find

在多个文件中查找文本

我们可以将 find 命令与 grep 命令结合使用,以查找各种文件中的文本。请看下面的命令

上面的命令将在 'Newdirectory' 目录中的所有文本文件中查找包含 'demo' 文本的行。请看下面的输出

Linux Find

从上面的输出中,我们可以看到包含文本 'demo' 的行已被显示。

搜索所有目录

上面的命令查找标题为 file1 的普通文件的所有目录,并将其打印到屏幕上。通常,不建议这样搜索文件。这会花费大量时间。所以,最好指定目录。一些操作系统可能会挂载对 find 命令不友好的文件系统(动态的)。包含 shell 特有字符的更复杂的文件名可能需要用单引号括起来。


下一主题Linux Locate