> For the complete documentation index, see [llms.txt](https://man.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://man.bsdcn.org/man1/find.1.md).

# find(1)

`find` — 遍历文件层次结构

## 名称

`find`

## 概要

`find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]`

`find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]`

## 描述

`find` 实用程序对列出的每个 `path` 递归地遍历目录树，针对树中的每个文件计算一个 `expression`（由下文列出的“主要条件”和“操作数”组成）。

选项如下：

**`-E`** 将 `-regex` 和 `-iregex` 主要条件之后的正则表达式解释为扩展（现代）正则表达式，而非基本正则表达式（BRE）。re\_format(7) 手册页完整描述了这两种格式。

**`-H`** 使得命令行上指定的每个符号链接所返回的文件信息和文件类型（参见 stat(2)）为该链接所指向文件的信息和类型，而非链接本身的信息和类型。如果被指向的文件不存在，则文件信息和类型为链接本身的信息和类型。命令行上未列出的所有符号链接的文件信息均为链接本身的信息。

**`-L`** 使得每个符号链接所返回的文件信息和文件类型（参见 stat(2)）为该链接所指向文件的信息和类型，而非链接本身的信息和类型。如果被指向的文件不存在，则文件信息和类型为链接本身的信息和类型。此选项等价于已弃用的 `-follow` 主要条件。

**`-P`** 使得每个符号链接所返回的文件信息和文件类型（参见 stat(2)）为链接本身的信息和类型。此为默认行为。

**`-X`** 允许 `find` 安全地与 [xargs(1)](/man1/xargs.1.md) 配合使用。如果文件名包含 [xargs(1)](/man1/xargs.1.md) 所使用的任何分隔字符，则在标准错误上显示一条诊断信息，并跳过该文件。分隔字符包括单引号（“`'`”）、双引号（“`"`”）、反斜杠（“`\`”）、空格、制表符和换行符。不过，你也可以考虑将 `-print0` 主要条件与 “`xargs` `-0`” 配合使用，作为一种有效的替代方案。

**`-d`** 使 `find` 执行深度优先遍历。此选项是 BSD 特有的，等价于 IEEE Std 1003.1-2001 ("POSIX.1") 规定的 `-depth` 主要条件。更多信息请参见下文“主要条件”一节的描述。

**`-f`** `path` 将 `path` 加入到将进行递归的路径列表中。当 `path` 以一个原本会被解释为 `expression` 的字符开头时（即 “`!`”、“`(`” 和 “`-`”），此选项很有用。

**`-s`** 使 `find` 按字典序（即每个目录内按字母顺序）遍历文件层次结构。注意：`find -s` 和 `find | sort` 可能给出不同的结果。例如，`find -s` 会将目录 `foo` 及其所有内容放在目录 `foo.` 之前，但 `find | sort` 会将目录名 `foo.` 放在任何类似 `foo/bar` 的字符串之前，因为在 ASCII 中 `.` 排在 `/` 之前。在 `C` 以外的区域设置中，由于排序规则差异，结果可能差异更大。

**`-x`** 阻止 `find` 进入设备号与开始遍历的文件设备号不同的目录。此选项等价于已弃用的 `-xdev` 主要条件。

## 主要条件

所有接受数值参数的主要条件都允许该数值前带加号（“`+`”）或减号（“`-`”）。前带加号表示“大于 n”，前带减号表示“小于 n”，两者都不带表示“恰好等于 n”。

**`-Bmin`** `n` 若文件的 inode 创建时间与 `find` 启动时间之差（向上取整到下一个完整分钟）为 `n` 分钟，则为真。

**`-Bnewer`** `file` 同 `-newerBm`。

**`-Btime`** `n`\[`smhdw`] 若未指定单位，此主要条件在文件的 inode 创建时间与 `find` 启动时间之差（向上取整到下一个完整 24 小时时段）为 `n` 个 24 小时时段时为真。若指定了单位，此主要条件在文件的 inode 创建时间与 `find` 启动时间之差恰好为 `n` 个单位时为真。关于支持的时间单位，请参见 `-atime` 主要条件的描述。

**`-acl`** 可与其他主要条件配合使用，以查找具有扩展 ACL 的文件。更多信息请参见 acl(3)。

**`-amin`** \[`-`|`+`]`n` 若文件最后访问时间与 `find` 启动时间之差（向上取整到下一个完整分钟）大于 `n`（`+n`）、小于 `n`（`-n`）或恰好等于 `n` 分钟前，则为真。

**`-anewer`** `file` 同 `-neweram`。

**`-atime`** `n`\[`smhdw`] 若未指定单位，此主要条件在文件最后访问时间与 `find` 启动时间之差（向上取整到下一个完整 24 小时时段）为 `n` 个 24 小时时段时为真。若指定了单位，此主要条件在文件最后访问时间与 `find` 启动时间之差恰好为 `n` 个单位时为真。可能的时间单位如下：

**`s`** 秒

**`m`** 分钟（60 秒）

**`h`** 小时（60 分钟）

**`d`** 天（24 小时）

**`w`** 周（7 天）

可在单个 `-atime` 参数中组合任意数量的单位，例如 “`-atime -1h30m`”。单位可能仅在配合 `+` 或 `-` 修饰符使用时才有用。

**`-cmin`** \[`-`|`+`]`n` 若文件状态信息最后变更时间与 `find` 启动时间之差（向上取整到下一个完整分钟）大于 `n`（`+n`）、小于 `n`（`-n`）或恰好等于 `n` 分钟前，则为真。

**`-cnewer`** `file` 同 `-newercm`。

**`-ctime`** `n`\[`smhdw`] 若未指定单位，此主要条件在文件状态信息最后变更时间与 `find` 启动时间之差（向上取整到下一个完整 24 小时时段）为 `n` 个 24 小时时段时为真。若指定了单位，此主要条件在文件状态信息最后变更时间与 `find` 启动时间之差恰好为 `n` 个单位时为真。关于支持的时间单位，请参见 `-atime` 主要条件的描述。

**`-d`** 不可移植的 BSD 特有版本，等价于 `depth`。GNU find 将其作为一个主要条件实现，是对 FreeBSD `find` 的错误模仿。

**`-delete`** 删除找到的文件和/或目录。始终返回真。此操作从当前工作目录开始执行，随着 `find` 向下遍历目录树。出于安全原因，它不会尝试删除路径名中相对于 “`.`” 含有 “`/`” 字符的文件名。此选项隐含深度优先遍历处理。若目录非空，`-delete` 主要条件将无法删除该目录。跟随符号链接与此选项不兼容。

> **警告：** `-delete` 主要条件在被求值时会立即尝试删除当前路径。注意其在表达式中的位置；作为一般规则，它几乎总是应该放在最后。如有疑问，可先尝试用 `-print` 代替 `-delete` 运行。关于求值顺序的更多信息，请参见下文的“运算符”一节。

**`-depth`** 始终为真；同不可移植的 `-d` 选项。使 `find` 执行深度优先遍历，即以后序方式访问目录，目录中的所有条目会在目录本身之前被处理。默认情况下，`find` 以前序方式访问目录，即在目录内容之前访问目录本身。注意，默认行为*不是*广度优先遍历。当 `find` 与 cpio(1) 配合处理包含在具有异常权限的目录中的文件时，`-depth` 主要条件很有用。它确保你在将文件放入目录时具有写权限，而将目录的权限设置放在最后进行。

**`-depth`** `n` 若文件相对于遍历起点的深度为 `n`，则为真。

**`-empty`** 若当前文件或目录为空，则为真。

**`-exec`** `utility` \[`argument ...`]`;` 若名为 `utility` 的程序以零值作为退出状态返回，则为真。可选的 `arguments` 可传递给该实用程序。表达式必须以分号（“`;`”）结束。如果你从 shell 调用 `find`，可能需要对分号加引号，以免 shell 将其视为控制运算符。如果字符串 “`{}`” 出现在实用程序名或参数中的任何位置，它会被替换为当前文件的路径名。`utility` 将从 `find` 执行时所在的目录执行。`utility` 和 `arguments` 不会进行 shell 模式和构造的进一步展开。

**`-exec`** `utility` \[`argument ...`]`{} +` 同 `-exec`，区别在于 “`{}`” 会被替换为每次调用 `utility` 时尽可能多的路径名。此行为类似于 [xargs(1)](/man1/xargs.1.md)。此主要条件始终返回真；如果至少一次 `utility` 调用返回非零退出状态，`find` 将返回非零退出状态。

**`-execdir`** `utility` \[`argument ...`]`;` `-execdir` 主要条件与 `-exec` 主要条件相同，区别在于 `utility` 将从持有当前文件的目录执行。替换字符串 “`{}`” 的文件名是非限定的。

**`-execdir`** `utility` \[`argument ...`]`{} +` 同 `-execdir`，区别在于 “`{}`” 会被替换为每次调用 `utility` 时尽可能多的路径名。此行为类似于 [xargs(1)](/man1/xargs.1.md)。此主要条件始终返回真；如果至少一次 `utility` 调用返回非零退出状态，`find` 将返回非零退出状态。

**`-executable`** 匹配当前用户可执行的文件。此测试使用 access(2) 系统调用，因此可能被执行 UID 映射（或 root-squashing）的 NFS 服务器所欺骗。这是 GNU find 的扩展。

**`-flags`** \[`-`|`+`]`flags`,`notflags` 标志使用符号名指定（参见 chflags(1)）。带有 “`no`” 前缀的（“`nodump`” 除外）被称为 `notflags`。`flags` 中的标志会被检查是否被设置，`notflags` 中的标志会被检查是否未被设置。注意这与 `-perm` 不同，后者仅允许用户指定被设置的模式位。如果标志前带减号（“`-`”），当 `flags` 中的所有位都至少被设置且 `notflags` 中的位均未被设置在文件的标志位中时，此主要条件为真。如果标志前带加号（“`+`”），当 `flags` 中的任一位被设置在文件的标志位中，或 `notflags` 中的任一位未被设置在文件的标志位中时，此主要条件为真。否则，当 `flags` 中的位与文件的标志位完全匹配，且 `flags` 中的位均不与 `notflags` 的位匹配时，此主要条件为真。

**`-fprint`** `filename` 此主要条件始终为真。这会创建 `filename`，或如果文件已存在则截断之。该文件在启动时创建。它将当前文件的路径名写入此文件，后跟一个换行符。如果没有文件被匹配，该文件将为空。

**`-fprint0`** `filename` 此主要条件始终为真。这会创建 `filename`，或如果文件已存在则截断之。该文件在启动时创建。它将当前文件的路径名写入此文件，后跟一个 ASCII `NUL` 字符（字符代码 0）。如果没有文件被匹配，该文件将为空。

**`-fstype`** `type` 若文件包含在类型为 `type` 的文件系统中，则为真。可使用 [lsvfs(1)](/man1/lsvfs.1.md) 命令查看系统上可用的文件系统类型。此外，还有两种伪类型：“`local`” 和 “`rdonly`”。前者匹配任何物理挂载在执行 `find` 的系统上的文件系统，后者匹配任何以只读方式挂载的文件系统。

**`-gid`** `gname` 同 `-group` `gname`，为与 GNU find 兼容而提供。GNU find 限制 `gname` 为数字，而 `find` 不限制。

**`-group`** `gname` 若文件属于组 `gname`，则为真。如果 `gname` 是数字且不存在这样的组名，则将 `gname` 视为组 ID。

**`-ignore_readdir_race`** 忽略因从目录读取名称后文件或目录被删除而导致的错误。此选项不影响发生在起始点上的错误。

**`-ilname`** `pattern` 类似 `-lname`，但匹配时不区分大小写。这是 GNU find 的扩展。

**`-iname`** `pattern` 类似 `-name`，但匹配时不区分大小写。

**`-inum`** `n` 若文件的 inode 号为 `n`，则为真。

**`-ipath`** `pattern` 类似 `-path`，但匹配时不区分大小写。

**`-iregex`** `pattern` 类似 `-regex`，但匹配时不区分大小写。

**`-iwholename`** `pattern` 同 `-ipath`，为与 GNU find 兼容而提供。

**`-links`** `n` 若文件有 `n` 个链接，则为真。

**`-lname`** `pattern` 类似 `-name`，但匹配的是符号链接的内容而非文件名。注意，只有在跟随符号链接时，这才会匹配到断开的符号链接。这是 GNU find 的扩展。

**`-ls`** 此主要条件始终为真。当前文件的以下信息会写入标准输出：其 inode 号、以 512 字节块为单位的大小、文件权限、硬链接数、所有者、组、以字节为单位的大小、最后修改时间和路径名。如果文件是块特殊文件或字符特殊文件，则显示设备号而非以字节为单位的大小。如果文件是符号链接，则所指向文件的路径名会在 “`->`” 之后显示。其格式与 “`ls` `-dils`” 所产生的格式相同。

**`-maxdepth`** `n` 始终为真；在命令行参数之下最多下降 `n` 个目录层级。如果指定了任何 `-maxdepth` 主要条件，它将应用于整个表达式，即使该部分原本不会被求值。“`-maxdepth` `0`” 将整个搜索限制为仅命令行参数。

**`-mindepth`** `n` 始终为真；不对小于 `n` 的层级应用任何测试或操作。如果指定了任何 `-mindepth` 主要条件，它将应用于整个表达式，即使该部分原本不会被求值。“`-mindepth` `1`” 处理除命令行参数之外的所有内容。

**`-mmin`** \[`-`|`+`]`n` 若文件最后修改时间与 `find` 启动时间之差（向上取整到下一个完整分钟）大于 `n`（`+n`）、小于 `n`（`-n`）或恰好等于 `n` 分钟前，则为真。

**`-mnewer`** `file` 同 `-newer`。

**`-mount`** 同 `-xdev`，为与 GNU find 兼容而提供。

**`-mtime`** `n`\[`smhdw`] 若未指定单位，此主要条件在文件最后修改时间与 `find` 启动时间之差（向上取整到下一个完整 24 小时时段）为 `n` 个 24 小时时段时为真。若指定了单位，此主要条件在文件最后修改时间与 `find` 启动时间之差恰好为 `n` 个单位时为真。关于支持的时间单位，请参见 `-atime` 主要条件的描述。

**`-name`** `pattern` 若所检查路径名的最后一个分量匹配 `pattern`，则为真。特殊的 shell 模式匹配字符 “`[`”、“`]`”、“`*`” 和 “`?`” 可作为 `pattern` 的一部分使用。这些字符可通过用反斜杠（“`\`”）转义来显式匹配。

**`-newer`** `file` 若当前文件的最后修改时间比 `file` 更近，则为真。

**`-newerXY`** `file` 若当前文件具有比 `file` 更近的最后访问时间（`X`=`a`）、inode 创建时间（`X`=`B`）、状态变更时间（`X`=`c`）或修改时间（`X`=`m`），或更近的最后访问时间（`Y`=`a`）、inode 创建时间（`Y`=`B`）、状态变更时间（`Y`=`c`）或修改时间（`Y`=`m`），则为真。此外，如果 `Y`=`t`，则 `file` 被解释为 ISO8601 或 RFC822 所理解的直接日期规范。注意 `-newermm` 等价于 `-newer`。

**`-nogroup`** 若文件属于未知的组，则为真。

**`-noignore_readdir_race`** 关闭 `-ignore_readdir_race` 的效果。此为默认行为。

**`-noleaf`** 此选项为与 GNU find 兼容而提供。在 GNU find 中，它禁用一项对 `find` 不相关的优化，因此被忽略。

**`-nouser`** 若文件属于未知的用户，则为真。

**`-ok`** `utility` \[`argument ...`]`;` `-ok` 主要条件与 `-exec` 主要条件相同，区别在于 `find` 会通过向终端打印一条消息并读取响应来请求用户确认 `utility` 的执行。如果响应不是肯定的（在 “`POSIX`” 区域设置中为 “`y`”），则不执行命令，且 `-ok` 表达式的值为假。

**`-okdir`** `utility` \[`argument ...`]`;` `-okdir` 主要条件与 `-execdir` 主要条件相同，区别与 `-ok` 主要条件所述相同。

**`-path`** `pattern` 若所检查的路径名匹配 `pattern`，则为真。特殊的 shell 模式匹配字符 “`[`”、“`]`”、“`*`” 和 “`?`” 可作为 `pattern` 的一部分使用。这些字符可通过用反斜杠（“`\`”）转义来显式匹配。斜杠（“`/`”）被视为普通字符，不必显式匹配。

**`-perm`** \[`-`|`+`|`/`]`mode` `mode` 可以是符号形式（参见 [chmod(1)](/man1/chmod.1.md)）或八进制数。如果 `mode` 是符号形式，则假定起始值为零，且 `mode` 设置或清除权限时不考虑进程的文件模式创建掩码。如果 `mode` 是八进制数，则只有文件模式位中的 07777（`S_ISUID | S_ISGID | S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO`）参与比较。如果 `mode` 前带减号（“`-`”），当 `mode` 中的所有位都至少被设置在文件的模式位中时，此主要条件为真。如果 `mode` 前带加号（“`+`”），当 `mode` 中的任一位被设置在文件的模式位中时，此主要条件为真。为与 GNU find 兼容，也接受斜杠（“`/`”），含义同加号。否则，当 `mode` 中的位与文件的模式位完全匹配时，此主要条件为真。注意，符号模式的首字符不能是减号（“`-`”）。

**`-print`** 此主要条件始终为真。它将当前文件的路径名打印到标准输出。如果未指定 `-exec`、`-ls`、`-print0` 或 `-ok` 中的任何一个，给定的表达式将被有效地替换为 `(` `given expression` `)` `-print`。

**`-print0`** 此主要条件始终为真。它将当前文件的路径名打印到标准输出，后跟一个 ASCII `NUL` 字符（字符代码 0）。

**`-printf`** `fmt` 此主要条件始终为真。它打印关于文件的信息，按“PRINTF 格式”一节中所述解释 ‘`\`’ 和 ‘`%`’ 转义序列。与 `-print` 不同，`-printf` 不会自动添加换行符。

**`-prune`** 此主要条件始终为真。它使 `find` 不进入当前文件。注意，如果指定了 `-d` 选项，`-prune` 主要条件将不起作用。

**`-quit`** 使 `find` 立即终止。

**`-readable`** 匹配当前用户可读的文件。此测试使用 access(2) 系统调用，因此可能被执行 UID 映射（或 root-squashing）的 NFS 服务器所欺骗。这是 GNU find 的扩展。

**`-regex`** `pattern` 若文件的整个路径使用正则表达式匹配 `pattern`，则为真。要匹配名为 “`./foo/xyzzy`” 的文件，可使用正则表达式 “`.*/[xyz]*`” 或 “`.*/foo/.*`”，但不能用 “`xyzzy`” 或 “`/foo/`”。

**`-samefile`** `name` 若文件是指向 `name` 的硬链接，则为真。如果指定了命令选项 `-L`，则当文件是指向 `name` 的符号链接时也为真。

**`-size`** `n`\[`ckMGTP`] 若文件的大小（向上取整，以 512 字节块为单位）为 `n`，则为真。如果 `n` 后跟 `c`，则当文件大小为 `n` 字节（字符）时此主要条件为真。类似地，如果 `n` 后跟一个比例指示符，则文件大小按以下方式与 `n` 比较：

**`k`** 千字节（1024 字节）

**`M`** 兆字节（1024 千字节）

**`G`** 吉字节（1024 兆字节）

**`T`** 太字节（1024 吉字节）

**`P`** 拍字节（1024 太字节）

**`-sparse`** 若当前文件是稀疏文件，即所分配的块数少于根据其字节大小的预期，则为真。这也可能匹配已被文件系统压缩的文件。

**`-type`** `t` 若文件为指定类型，则为真。可能的文件类型如下：

**`b`** 块特殊文件

**`c`** 字符特殊文件

**`d`** 目录

**`f`** 常规文件

**`l`** 符号链接

**`p`** FIFO

**`s`** 套接字

**`-uid`** `uname` 同 `-user` `uname`，为与 GNU find 兼容而提供。GNU find 限制 `uname` 为数字，而 `find` 不限制。

**`-user`** `uname` 若文件属于用户 `uname`，则为真。如果 `uname` 是数字且不存在这样的用户名，则将 `uname` 视为用户 ID。

**`-wholename`** `pattern` 同 `-path`，为与 GNU find 兼容而提供。

**`-writable`** 匹配当前用户可写的文件。此测试使用 access(2) 系统调用，因此可能被执行 UID 映射（或 root-squashing）的 NFS 服务器所欺骗。这是 GNU find 的扩展。

**`-xattr`** 匹配在任何支持的命名空间中设置了扩展属性的文件。

**`-xattrname`** `xattr` 匹配设置了指定 `xattr` 扩展属性的文件。默认情况下搜索所有支持的命名空间，但 `xattr` 可带 “user:” 或 “system:” 前缀以按命名空间过滤。注意，不支持命名属性，仅支持由例如 setextattr(8) 所设置的扩展属性。

## 运算符

主要条件可使用以下运算符组合。运算符按优先级递减的顺序列出。

**`(`** `expression` `)` 若括号内的表达式为真，则求值为真。

**`!`** `expression`

**`-not`** `expression` 此为一元 NOT 运算符。若表达式为假，则求值为真。

**`-false`** 始终为假。

**`-true`** 始终为真。

**`expression`** `-and` `expression`

**`expression expression`** `-and` 运算符是逻辑 AND 运算符。由于它由两个表达式的并置所隐含，因此不必显式指定。若两个表达式均为真，则该表达式为真。若第一个表达式为假，则不计算第二个表达式。

**`expression`** `-or` `expression` `-or` 运算符是逻辑 OR 运算符。若第一个或第二个表达式为真，则该表达式为真。若第一个表达式为真，则不计算第二个表达式。

所有操作数和主要条件必须是 `find` 的独立参数。自身接受参数的主要条件期望每个参数都是 `find` 的独立参数。

## PRINTF 格式

识别以下 ‘`\`’ 转义序列：

**\a** 写入一个 <响铃> 字符。

**\b** 写入一个 <退格> 字符。

**\c** 不写入任何字符，但终止字符串并在每次匹配后刷新迄今为止的输出。

**\f** 写入一个 <换页> 字符。

**\n** 写入一个 <换行> 字符。

**\r** 写入一个 <回车> 字符。

**\t** 写入一个 <制表符> 字符。

**\v** 写入一个 <垂直制表符> 字符。

**'** 写入一个 <单引号> 字符。

**\\** 写入一个反斜杠字符。

\*\*\*\*`num` 写入一个值为一至三位八进制数 `num` 的字节。可使用多个 `\``num` 序列构造多字节字符。

每个格式规范以百分号（“`%`”）引入。格式规范的其余部分按以下顺序包括：

**零个或多个以下标志：**

**`#`** 一个 “`#`” 字符，对几乎所有格式无影响。尚未实现。

**`-`** 一个减号 “`-`”，指定在所示字段中输出*左对齐*；尚未实现。

**字段宽度：** 一个可选的数字串，指定一个*字段宽度*；如果输出串的字节数少于字段宽度，则在左侧（若给出了左对齐指示符则在右侧）填充空格以补足字段宽度（注意前导零是一个标志，但嵌入的零是字段宽度的一部分）；尚未实现。

**精度：** 一个可选的句点 “`.`” 后跟一个可选的数字串，给出一个*精度*，指定从字符串中打印的最大字节数；如果数字串缺失，精度被视为零；尚未实现。

**格式：** 一或两个字符，描述如下，指示要显示的信息。任何未列出的格式均不受支持，但错误信息会有所不同。

**`p`** 文件路径

**`f`** 不带目录的文件名。

**`h`** 相对于起始点的路径，或如果由于某种原因为空则为 “.”。

**`P`** 未实现 —— 带命令行参数的文件。

**`H`** 未实现 —— 命令行参数。

**`g`** 以人类可读形式表示的 gid。

**`G`** 以数字形式表示的 gid。

**`h`** 以人类可读形式表示的 uid。

**`U`** 以数字形式表示的 uid。

**`m`** 以八进制表示的文件权限模式。

**`M`** 以 [ls(1)](/man1/ls.1.md) 标准形式表示的文件模式。

**`k`** 以 KiB（1024 字节为单位）表示的文件大小。

**`b`** 以块为单位的文件大小（始终为 512 字节单位，即使底层存储大小不同）。

**`s`** 文件的字节大小。

**`S`** 文件的稀疏程度。文件占用的块数乘以 512 除以文件大小。

**`d`** 在树中的深度

**`D`** 文件的设备号。

**`F`** 未实现 —— 文件所在的文件系统类型。

**`l`** 符号链接所指向的对象。

**`i`** 文件的 inode。

**`n`** 硬链接数。

**`y`** 表示文件类型的单个字符。

**`Y`** 表示文件类型的单个字符。如果文件是符号链接，则改为显示链接目标的信息；若链接循环则显示 “`L`”，若目标不存在则显示 “`N`”，若尝试确定目标类型时发生任何其他错误则显示 “`?`”。

**`a`** 文件的访问时间。

**`A`** 以 strftime 格式表示的文件访问时间。需附加参数。

**`B`** 以 strftime 格式表示的文件创建时间。需附加参数。

**`c`** 文件的创建时间。

**`C`** 以 strftime 格式表示的文件创建时间。需附加参数。

**`t`** 文件的修改时间。

**`T`** 以 strftime 格式表示的文件修改时间。需附加参数。

## 环境变量

`LANG`、`LC_ALL`、`LC_COLLATE`、`LC_CTYPE`、`LC_MESSAGES` 和 `LC_TIME` 环境变量如 [environ(7)](/man7/environ.7.md) 中所述影响 `find` 实用程序的执行。

## 实例

以下示例按输入给 shell 的形式展示：

```sh
find / \! -name "*.c" -print
```

打印所有名称不以 **`.c`** 结尾的文件列表。

```sh
find / -newer ttt -user wnj -print
```

打印所有属于用户 “wnj” 且比文件 **`ttt`** 更新的文件列表。

```sh
find / \! \( -newer ttt -user wnj \) -print
```

打印所有不同时满足比 **`ttt`** 更新且属于 “wnj” 的文件列表。

```sh
find / \( -newer ttt -or -user wnj \) -print
```

打印所有属于 “wnj” 或比 **`ttt`** 更新的文件列表。

```sh
find / -newerct '1 minute ago' -print
```

打印所有 inode 变更时间比当前时间减去一分钟更近的文件列表。

```sh
find / -type f -exec echo {} \;
```

使用 echo(1) 命令打印所有文件的列表。

```sh
find -L /usr/ports/packages -type l -exec rm -- {} +
```

删除 **`/usr/ports/packages`** 中所有断开的符号链接。

```sh
find /usr/src -name CVS -prune -o -depth +6 -print
```

查找工作目录 **`/usr/src`** 中深度至少为七层的文件和目录。

```sh
find /usr/src -name CVS -prune -o -mindepth 7 -print
```

不等价于上一个示例，因为 `-prune` 在第七层之下不会被求值。

## 兼容性

`-follow` 主要条件已弃用；应改用 `-L` 选项。详情参见下文“标准”一节。

## 参见

chflags(1), [chmod(1)](/man1/chmod.1.md), [locate(1)](/man1/locate.1.md), [lsvfs(1)](/man1/lsvfs.1.md), [whereis(1)](/man1/whereis.1.md), [which(1)](/man1/which.1.md), [xargs(1)](/man1/xargs.1.md), extattr(2), [stat(2)](/sys/stat.2.md), [acl(3)](/posix1e/acl.3.md), [fts(3)](/gen/fts.3.md), [getgrent(3)](/gen/getgrent.3.md), [getpwent(3)](/gen/getpwent.3.md), [strmode(3)](/string/strmode.3.md), [ascii(7)](/man7/ascii.7.md), re\_format(7), [symlink(7)](/man7/symlink.7.md), setextattr(8)

## 标准

`find` 实用程序的语法是 IEEE Std 1003.1-2001 ("POSIX.1") 标准所指定语法的超集。

除 `-H` 和 `-L` 外的所有单字符选项，以及 `-amin`、`-anewer`、`-cmin`、`-cnewer`、`-delete`、`-empty`、`-fstype`、`-iname`、`-inum`、`-iregex`、`-ls`、`-maxdepth`、`-mindepth`、`-mmin`、`-not`、`-path`、`-print0`、`-regex`、`-sparse` 和所有与 `-B*` 出生时间相关的主要条件，都是对 IEEE Std 1003.1-2001 ("POSIX.1") 的扩展。

历史上，`-d`、`-L` 和 `-x` 选项通过主要条件 `-depth`、`-follow` 和 `-xdev` 实现。这些主要条件始终求值为真。由于它们实际上是在遍历开始前生效的全局变量，某些合法的表达式可能产生意外结果。例如表达式 `-print` `-o` `-depth`。由于 `-print` 始终求值为真，标准求值顺序意味着 `-depth` 永远不会被求值。但实际情况并非如此。

`-or` 运算符被实现为 `-o`，`-and` 运算符被实现为 `-a`。

历史上 `-exec` 和 `-ok` 主要条件的实现不会替换实用程序名或实用程序参数中前面或后面有非空白字符的字符串 “`{}`”。本版本无论它出现在实用程序名或参数中的何处都会替换。

`-E` 选项受到等效的 [grep(1)](/man1/grep.1.md) 和 [sed(1)](/man1/sed.1.md) 选项启发。

`-perm` 主要条件接受前导斜杠（“`/`”）作为前导加号（“`+`”）的别名，作为对 IEEE Std 1003.1-2001 ("POSIX.1") 的扩展，以与 GNU find 兼容。

## 历史

简单的 `find` 命令出现于 Version 1 AT\&T UNIX，在 Version 3 AT\&T UNIX 中被移除。它为 Version 5 AT\&T UNIX 重写，后来为程序员工作台（PWB）增强。这些变更后来被并入 Version 7 AT\&T UNIX。

## 缺陷

`find` 使用的特殊字符对许多 shell 程序而言也是特殊字符。特别是字符 “`*`”、“`[`”、“`]`”、“`?`”、“`(`”、“`)`”、“`!`”、“`\`” 和 “`;`” 可能需要从 shell 中转义。

由于没有分隔符来分隔选项和文件名，或文件名和 `expression`，因此难以指定名为 `-xdev` 或 `!` 的文件。这些问题由 `-f` 选项和 getopt(3) 的 “`--`” 结构处理。

`-delete` 主要条件与其他会改变文件系统树遍历选项的选项配合不佳。

`-mindepth` 和 `-maxdepth` 主要条件实际上是全局选项（如上文所述）。它们可能应该被替换为看起来像选项的选项。
