find 命令

用途

用匹配表达式查找文件。

语法

find [-H | -L] 路径 ... [表达式]

描述

find 命令针对所指定的每个 Path 参数以递归方式搜索目录树,以搜索与布尔表达式相匹配的文件。 布尔表达式是通过使用以下文本中提供的项来编写的。 当 find 命令以递归方式将目录结构降级时,它并不会降级到那些只是象征性链接到当前层次结构的目录。 find 命令的输出取决于 Expression 参数指定的项。

find 命令不支持 4.3 BSD 快速查找语法。

标志

描述
-H 使针对命令行上遇到的每个符号链接求值的文件信息和文件类型就是该链接所引用文件的信息和类型,而不是该链接本身。 如果所引用文件不存在,那么会将文件信息和类型用于该链接本身。 不在命令行上的所有符号链接的文件信息是链接本身的文件信息。
-L 使针对每个符号链接求值的文件信息和文件类型就是该链接所引用文件的信息和类型,而不是该链接本身。

表达式项

这些布尔表达式和变量描述了 find 命令的搜索边界,如在 Path Expression 参数定义的那样。
注: 在以下定义中, n 变量指定可表示为 +n (大于 n) , -n (小于 n) 的十进制整数。 或 n (正好是 n) , Number 变量指定一个十进制整数,可以表示为 +Number (大于 Number) , -Number (小于 Number) 或 Number (Number-1 到 Number)。
描述
\(表达式\) 如果括号中的表达式为 True,那么求值为 true。
-amin n n 的值可以是下列其中一个值:
n
如果用初始化时间减去文件访问时间,再除以 60 秒(舍去任何余数)所获得的值为 n,那么求值为 True。
- n
如果用初始化时间减去文件访问时间,再除以 60 秒(舍去任何余数)所获得的值小于 n,那么求值为 True。
+n
如果从初始化时间中减去的文件访问时间除以 60 秒 (废弃任何余数) 大于 n (对于 UNIX03,大于 n+ 1) ,那么求值为 True。

例如,如果在 1 到 2 分钟内访问文件,那么 -amin 2 为 true。

注: 不考虑在 find 命令启动时间之后访问的文件。 但是,当 find 命令在一元 NOT 运算符中用于非UNIX03 行为时,将显示在命令开始时间之后修改的文件,直到 n的值为止。
-atime n n 的值可以是下列其中一个值:
n
如果用初始化时间减去文件访问时间,再除以 86400 秒(舍去任何余数)所获得的值为 n,那么求值为 True。
- n
如果用初始化时间减去文件访问时间,再除以 86400 秒(舍去任何余数)所获得的值小于 n,那么求值为 True。
+n
如果从初始化时间中减去的文件访问时间除以 86400 秒 (废弃任何余数) 大于 n (对于 UNIX03,大于 n+ 1) ,那么求值为 True。
注: -atime 的定义已更改为符合单一 UNIX 规范 V 3。 如果在 n-1 到 n 的 24 小时倍数中访问了该文件,那么 -atime 的先前行为求值为 True。 缺省情况下, find -atime 的工作方式与 UNIX03之前的工作方式相同。 可以通过将环境变量 XPG_SUS_ENV 设置为 ON 并将 XPG_UNIX98 设置为 OFF来获取 UNIX03 行为。

可通过将 XPG_UNIX98 变量设置为 ON来获取此选项的先前行为。

不会将 find 命令启动时间之后访问的文件考虑在内。 但是,当 find 命令在一元 NOT 运算符中用于非UNIX03 行为时,将显示在命令开始时间之后修改的文件,直到 n的值为止。

-cmin n n 的值可以是下列其中一个值:
n
如果用初始化时间减去文件索引节点修改时间,再除以 60 秒(舍去任何余数)所获得的值为 n,那么求值为 True。
- n
如果用初始化时间减去文件索引节点修改时间,再除以 60 秒(舍去任何余数)所获得的值小于 n,那么求值为 True。
+n
如果从初始化时间中减去的文件索引节点修改时间除以 60 秒 (废弃任何余数) 大于 n (对于 UNIX03,大于 n+ 1) ,那么求值为 True。
注: 不考虑在 find 命令开始时间之后修改的具有索引节点的文件。 但是,当 find 命令在一元 NOT 运算符中用于非UNIX03 行为时,将显示在命令开始时间之后修改了索引节点的文件,直到显示 n的值为止。
-cpio Device cpio 命令格式将当前文件写入指定的设备。
-ctime n n 的值可以是下列其中一个值:
n
如果用初始化时间减去文件索引节点修改时间,再除以 86400 秒(舍去任何余数)所获得的值为 n,那么求值为 True。
- n
如果用初始化时间减去文件索引节点修改时间,再除以 86400 秒(舍去任何余数)所获得的值小于 n,那么求值为 True。
+n
如果从初始化时间中减去的文件索引节点修改时间除以 86400 秒 (废弃任何余数) 大于 n (对于 UNIX03,大于 n+ 1) ,那么求值为 True。
注: -ctime 的定义已更改为符合 Single UNIX Specification V 3。 如果以 24 小时的 n-1 到 n 倍数访问文件,那么 -ctime 的先前行为求值为 True。 缺省情况下, find -ctime 的工作方式与 UNIX03之前的工作方式相同。 可以通过将环境变量 XPG_SUS_ENV 设置为 ON 并将 XPG_UNIX98 设置为 OFF来获取 UNIX03 行为。

可通过将 XPG_UNIX98 变量设置为 ON来获取此选项的先前行为。

不会将具有 find 命令启动时间之后修改的索引节点的文件考虑在内。 但是,当 find 命令在一元 NOT 运算符中用于非UNIX03 行为时,将显示在命令开始时间之后修改了索引节点的文件,直到显示 n的值为止。

-depth 始终求值为 True。 导致目录层次下降,这样该目录里的所有条目在该目录本身受影响之前被影响。 这在 find 命令与 cpio 命令配合使用以传输包含在没有写许可权的目录中的文件时很有用。
-ea 如果文件具有访问控制信息 (ACL) 或扩展属性 (EA) 集,那么求值为 True。
-exec Command 如果被指定的命令运行或者返回 0 值作为退出状态时,求值为 True。 指定命令的末尾必须标有括在引号内的分号、转义的分号或者加号。 包含两个字符 {}(花括号)的参数后面必须跟有标在指定命令末尾处的加号。 命令参数 {}(花括号)将由当前路径名替换。
-follow 导致符号的和硬链接被跟随:
-fstype Type 如果文件所属的文件系统属于所指定的类型,那么求值为 True。 Type 变量的值可为 jfs(日志文件系统)、nfs(网络文件系统)、jfs2(增强型日志文件系统)、procfs(proc 文件系统)或者 namefs(名称文件系统)。
-group Group 求值为 True,如果文件属于指定的组。 如果 Group 变量的值是数字,并且没有在 /etc/group 文件中出现,它就被解释成组标识。
-iname 文件名/模式 如果文件名模式变量的值与文件名匹配,则值为 True。 -iname选项与 "-name选项类似,但它执行的是不区分大小写的搜索。 您可以使用通配符,如*?[]作为搜索操作的关键字。
-inum n 求值为 True,如果文件有一个索引节点与变量 n 的值匹配。
-links n 求值为 True,如果文件有指定数目的链接。 请参阅 ln 命令中关于链接的描述。
-iregex 正则表达式 如果文件的完整路径名与正则表达式相匹配,那么求值为 True。 此选项与 -regex 选项相似,只不过匹配不区分大小写。
-long -ls结合使用时,打印每个用户/组名的所有可用字符,而不是截断为第一个 8。
-ls 始终求值为 True。 导致当前路径名与其关联统计信息一起被打印出来。 这些统计信息包括下列值:
  • 索引节点号
  • 以 KB(即 1024 字节)计的大小
  • 保护方式
  • 硬链接的数目
  • 用户
  • 按字节计的大小
  • 修改时间

如果文件是特殊文件,大小字段包含主要和次要设备数目。 如果文件是符号链接,那么将在链接到文件的路径名前面打印-> (连字符,大于) 符号。 格式设置与 ls -filds 命令的效果类似,但是,格式设置是在内部完成,而不运行 ls 命令。 因此,其输出与 ls 命令的输出可能存在差异,例如,保护方式存在差异。

-mmin n n 的值可以是下列其中一个值:
n
如果用初始化时间减去文件修改时间,再除以 60 秒(舍去任何余数)所获得的值为 n,那么求值为 True。
- n
如果用初始化时间减去文件修改时间,再除以 60 秒(舍去任何余数)所获得的值小于 n,那么求值为 True。
+n
如果从初始化时间中减去的文件修改时间除以 60 秒 (废弃任何余数) 大于 n (对于 UNIX03,大于 n+ 1) ,那么求值为 True。
注: 不考虑在 find 命令开始时间之后修改的文件。 但是,当 find 命令在一元 NOT 运算符中用于非UNIX03 行为时,将显示在命令开始时间之后修改的文件,直到 n的值为止。
-mtime n n 的值可以是下列其中一个值:
n
如果从初始化时间中减去的文件修改时间除以 86400 秒 (废弃任何余数) 为 n,那么求值为 True。 86400 秒是 24 小时。
- n
如果用初始化时间减去文件修改时间,再除以 86400 秒(舍去任何余数)所获得的值小于 n,那么求值为 True。
+n
如果从初始化时间中减去的文件修改时间除以 86400 秒 (废弃任何余数) 大于 n (对于 UNIX03,大于 n+ 1) ,那么求值为 True。
注: -mtime 的定义已更改为符合 Single UNIX Specification , Version 3。 如果在 n-1 到 n 的 24 小时倍数中修改了文件,那么 -mtime 的先前行为求值为 True。 缺省情况下, find -mtime 的工作方式与 UNIX03之前的工作方式相同。 可以通过将环境变量 XPG_SUS_ENV 设置为 ON 并将 XPG_UNIX98 设置为 OFF来获取 UNIX03 行为。

可通过将 XPG_UNIX98 变量设置为 ON来获取此选项的先前行为。

不会将 find 命令启动时间之后修改的文件考虑在内。 但是,当 find 命令在一元 NOT 运算符中用于非UNIX03 行为时,将显示在命令开始时间之后修改的文件,直到 n的值为止。

-name 文件 求值为 True,如果 File 变量的值与文件名称匹配。 可使用典型的 shell 文件名生成字符(请参阅 sh 命令)。 必须使用引号或转义字符将此模式引起来。 当从 Shell 中使用 find 命令时,使用转义字符将此模式引起来。 反斜杠符号 (\) 在模式中会被用作一个转义字符。 您可以使用通配符(模式匹配),只要它们在引号以内。

在诸如 [a-z] 之类的表达式中,连字符意味着按照当前整理顺序“直到”。 整理顺序可定义等价类以供在字符范围中使用。 有关整理序列和等价类的更多信息,请参阅 全球化指南和参考中的 全球化概述

-newer 文件 如果修改当前文件的时间比 File 变量所指示文件的时间更近,那么求值为 True。
-nogroup 求值为 True,如果文件属于一个组但是不在 /etc/group 数据库中。
-nouser 如果文件属于不在 /etc/passwd 数据库中的用户,那么求值为 True。
-ok 命令 -exec 表达式相同,只是 find 命令验证它是否必须启动指定的命令。 一个肯定的响应会启动此命令。 指定命令的末尾必须加上引在引号中的分号或 \;(反斜杠转义分号)。
-perm [-] OctalNumber 如果文件的许可权代码与 OctalNumber 参数完全匹配,那么求值为 True。 有关文件许可权的详细信息,请参阅 chmod 命令。 如果存在可选的 -(连字符),并且至少设置了这些许可权,那么此表达式求值为 true。 OctalNumber 参数值可达到 9 位八进制数。
注: 对于属于 TCB 环境的文件,将向这些文件的许可权添加其他安全位。 这些文件设置了 S_ITCB 位,并且安全位集定义为 0x010000000。 因此,支持 TCB 的文件的八进制许可权值必须包括位设置 100000000 以及它的其他许可权位。

示例:要列示 TCB 环境中的某个文件,请输入:find -perm 100000600 -print。 它会列示仅具有所有者读写许可权并且包含在 TCB 环境中的文件的名称。 请参阅 chmod 命令以获取许可权代码的说明。

-perm [-] 方式 方式参数用于表示文件的模式位。 它的格式与 chmod 中描述的 <symbolicmode> 操作符相同,解释如下:

最初,假定模板清除了所有文件方式位。 Op (-) 符号具有以下功能:

+
在模板中设置相应的方式位
-
清除相应的位
=
设置相应的方式位,不考虑进程的文件方式创建掩码的内容

op 符号 - 不能是方式的首字母。 这会避免可选前导连字符的不确定性。 由于初始方式是所有位都关闭,因此不存在必须使用 - 作为第一个字符的符号方式。

如果连字符省略了,当文件许可位恰好与结果模板的值匹配时,最初求值为 True。 否则,如果在方式前面添加了连字符作为前缀,并且至少在文件许可权位中设置了所获得的模板中的所有位,那么最初将求值为 True。

Mode 参数与 chmod 命令的语法是一样的。 如果文件恰好有这些许可权,这个表达式求值为 True。 如果存在可选的 -(连字符),并且至少设置了这些许可权,那么此表达式求值为 true。

-print 始终求值为 True。 显示当前路径名。 find 命令采用 -print 表达式,除非存在 -exec, - ls-ok 表达式。
-prune 始终求值为 True。 如果当前路径名是一个目录,停止它的下降。 如果指定了 -depth 标志,那么忽略 -prune 标志。
-size n 如果文件是指定的 n 个块长(每块 512 字节),那么求值为 True。 为了比较,文件大小四舍五入到相比差异最小的块的大小。
-regex 正则表达式 如果文件的完整路径名与正则表达式相匹配,那么求值为 True。 此选项不会搜索正则表达式,但是会使正则表达式与文件的完整路径名相匹配。 例如,要匹配名为 ./test 的文件,您可以使用正则表达式 .*test.* 或者 .*t.*t,但是不能使用 t.*t
-regextype Type 始终求值为 True。 此选项指定 -regex-iregex 选项的正则表达式语法的类型。 它也会影响出现在命令行后面的正则表达式。

Type 变量可以具有下列其中一个值:

Basic
适用于基本正则表达式语法。
Extended
适用于扩展正则表达式语法。
注: 如果未使用 -regextype 选项,那么正则表达式将解释为 basic
-size nc 如果文件恰好是指定的 n 个字节长,那么求值为 True。 将 c 添加到变量 n 的末尾表示文件的大小是以单独的字节而非块来测量的。
-type 类型 如果 Type 变量指定了以下值之一,那么求值为 True:
b
块特殊文件
c
字符特别文件
d
目录
f
无格式文件
l
符号链接
p
FIFO(指定的管道)
s
套接字
-user 用户 如果文件属于指定用户,那么求值为 True。 如果 User 变量的值是数字,并且不作为登录名称在 /etc/passwd 文件中出现,它解释为用户标识。
-xdev 始终求值为 True。 避免 find 命令从一个与 Path 参数指定的不同的文件系统中遍历。

可通过按优先权降低的顺序使用以下运算符来将下列表达式组合在一起:

  1. ( Expression ) - 表达式和运算符的附加组(括号特定于 shell,并且需要反斜杠转义序列)。
  2. ! Expression -表达式的求反 ('!' 是一元 NOT 运算符)。
  3. Expression [ -a ] Expression - 表达式的并置(AND 运算由两个初始量的并置默示,也可采用 -a 显式声明)。
  4. Expression -o Expression - 初始量的交替;-o 是 OR 运算符。 如果第一个表达式是 true,那么不会对第二个表达式求值。
注:findcpio 命令一起使用时,必须将 -follow 选项和 -L 选项与 cpio 命令配合使用。 不一起使用这两个选项会造成不期望的结果。 如果不存在表达式,那么像在缺省表达式中使用 -print 一样。 例如,如果指定的表达式不包含任何主项 -exec-ok 或 -print,那么表达式将替换为 (given_expression) -print-user-group-newer 主项各自仅对各自的自变量求值一次。 使用由 -exec-ok 指定的命令不会影响对同一文件的后续初始量。

退出状态

本命令返回以下退出值:

描述
0 所有的 Path 参数都被成功遍历。
>0 发生错误。

示例

  1. 要列示具有指定基本文件名的文件系统中的所有文件,请输入以下命令:
    find /  -name .profile -print
    此命令将搜索整个文件系统,并且写出以 .profile 命名的所有文件的完整路径名称。 该 /(斜杠) 指示 find 命令搜索根目录及其所有子目录。 要节约时间,最好通过指定您认为那些文件可能存在的文件目录的方式来限定搜索。
  2. 要对根目录中名称为 "data的所有目录执行大小写不敏感的搜索操作,请输入以下命令:
    find / -type d -iname data
  3. 要列出当前目录树中具有特定许可权代码的文件,请输入以下命令:
    find . -perm 0600  -print
    此命令会列示仅具有所有者读写许可权的文件的名称。 这个 (点)用于指示 find 命令搜索当前目录及其子目录。 请参阅 chmod 命令以获取许可权代码的说明。
  4. 要在多个目录中搜索具有特定许可权代码的文件,请输入以下命令:
    find manual clients proposals -perm -0600  -print
    此命令会列示那些具有所有者读写许可权和可能具有其他许可权的文件的名称。 该manual,clientsproposals搜索目录及其子目录。 在上一个示例中,-perm 0600仅选择具有匹配的许可权代码的文件0600确切地说 在此示例中,-perm -0600选择具有允许所指示访问权的许可权代码的文件0600和其他访问权0600级别。 它还与许可权代码 0622 和 0744 相匹配。
  5. 要列出当前目录中在当前 24 小时时间段内更改的所有文件,请输入以下命令:
    find .  -ctime 1  -print
  6. 要搜索具有多个链接的常规文件,请输入以下命令:
    find .  -type f  -links +1  -print
    此命令列示普通文件的名称 (-type f) 具有多个链接 (-links +1).
    注: 每个目录至少有两个链接: 其父目录中的条目及其自己的条目.(点)条目。 ln 命令解释多个文件链接。
  7. 要查找其路径名包含 find的所有可访问文件,请输入以下命令:
    find .  -name '*find*' -print
  8. 除去指定的所有文件a.out*.o如果一周内未访问并且未使用 nfs安装,请输入以下命令:
    find / \( -name a.out -o -name '*.o' \) -atime +7 ! -fstype nfs -exec rm {} \;
    注: -atime 表达式中使用的数字为 +7。 如果希望对那些超过一周(7 个 24 小时)时间未访问的文件运行命令,那么这是正确的命令行条目。
  9. 要打印当前目录中或其下的所有文件 (除了名为 SCCS 的目录或 SCCS 目录中的文件) 的路径名,请输入以下命令:
    find .  -name SCCS  -prune -o -print
    要打印在当前目录或者当前目录的子目录下的所有文件的路径名(包括目录 SCCS 的名称),请输入:
    find . -print -name SCCS -prune
  10. 要对当前目录及其所有子目录中文件名为 "test的所有文件执行不区分大小写的搜索操作,请输入以下命令:
    find . -iname test
  11. 要搜索所有长度正好为 414 字节的文件,请输入以下命令:
    find . -size 414c -print
  12. 要对 "/home/user/Documents目录下扩展名为 ".txt的所有文件执行大小写不敏感搜索操作,请输入以下命令:
    find /home/user/Documents -iname "*.txt"
  13. 要查找并除去主目录中带有 .c 后缀的每个文件,请输入以下命令:
    find /u/arnold -name "*.c" -exec rm {} \;
    每次 find 命令标识具有 .c 后缀的文件时, rm 命令都会删除该文件。 rm 命令是为 -exec 表达式指定的唯一参数。 {} (花括号) 表示当前的路径名称。
  14. 在此示例中, dirlink 是指向目录 dir的符号链接。 要通过在命令行上引用符号链接 dirlink 来列出 dir 中的文件,请输入以下命令:
    find -H dirlink -print
  15. 在此示例中, dirlink 是指向目录 dir的符号链接。 要列出 dirlink中的文件,遍历 dir 下的文件层次结构 (包括任何符号链接) ,请输入以下命令:
    find -L dirlink -print
  16. 要确定符号链接 dirlink 引用的文件 dir1 是否比 dir2更新,请输入以下命令:
    find -H dirlink -newer dir2
    注: 由于使用了 -H 标志,因此不会从 dirlink 收集时间数据,而是从 dir1收集时间数据,这可以通过遍历符号链接来找到。
  17. 要使用扩展用户和组名以 ls 格式在当前目录中生成文件列表,请输入以下命令:
    find . -ls -long
  18. 要列出当前目录中设置了 ACL/EA 的文件,请输入以下命令:
    find . -ea
  19. 要列出在 60 分钟内修改的文件,请输入以下命令:
    find . -mmin -60
  20. 要在 /home 目录中查找路径名中包含模式 afile 的所有路径名,请输入以下命令:
    find /home -regextype basic -regex ".*afile.*"
  21. 要在 /home 目录中查找路径名中包含模式 afilecap 的所有路径名,请输入以下命令:
    find /home -regextype extended -regex ".*afile.*|.*cap.*"
  22. 要在 /home 目录中查找路径名中包含模式 afileAFILEcapCAp 的所有路径名,请输入以下命令:
    find /home -regextype extended -iregex ".*afile.*|.*cap.*"
  23. 要对根目录及其子目录中文件名包含字符串 "main且扩展名长度以字母 "o结尾的所有文件执行不区分大小写的搜索操作,请输入以下命令:
    find / -iname "*main*.*o"
    该命令的搜索结果会返回 "main.o、"app_main.c.o、"mAin.O或 "APP_MAIN.o等文件。
  24. 要对根目录及其子目录中文件名包含 "main字符串且扩展名为单字符的所有文件执行不区分大小写的搜索操作,请输入以下命令:
    find / -iname "*main*.?"
    该命令的搜索结果会返回 "main.c、"app_main.o、"MAIN.c或 "App_main.o等文件。
  25. 要对根目录及其子目录中扩展名为 ".T(后跟任意一个字符)和字母 "t的所有文件执行不区分大小写的搜索操作,请输入以下命令:
    find / -iname "*.T?t"
    该命令的搜索结果会返回 "file.T1t、"log.Tot、"file.txt、"log.tot"或 "log.toT等文件。
  26. 要对根目录及其子目录中扩展名为 ".Sh、".md、".Sd或 ".mh的所有文件执行不区分大小写的搜索操作,请输入以下命令:
    find / -iname "*.[Sm][hd]"
    该命令的搜索结果会返回 "readme.sh、"logo.md、"logo.sd、"readme.mh"、"readme.SH"或 "logo.mD等文件。

文件

描述
/usr/bin/find 包含 find 命令。
/bin/find find 命令的符号链接。
/etc/group 包含所有已知组的列表。
/etc/passwd 包含所有已知用户的列表。