名称
find - 在目录级别搜索文件。
用法
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
描述
GNU find 搜索以每个给定起点为根的目录树,通过从左到右评估给定的表达式,根据 优先级规则(参见操作员部分),直到结果已知(左侧为假代表“与”操作 , 为真代表或 操作),此时 find 移动到下一个文件名。 如果没有指定起始点,则假设为'.'。
选项
-H、-L 和 -P 选项控制符号链接的处理。 这些后面的命令行参数被视为要检查的文件或 目录的名称,直到第一个以“-”开头的参数,或参数“(”或“!”。该参数和任何后续参数都 将被采用是描述要搜索的内容的表达式。如果没有给出路径,则使用当前目录。如果没 有给出表达式,则使用表达式 -print(但无论如何你应该考虑使用 -print0 代替)。这些 选项控制 find 的行为,但在最后一个路径名之后立即指定。 五个“真实”选项 -H、-L、 -P、-D 和 -O 必须出现在第一个路径名之前,如果有的话。 双破折号 -- 也可用于表示 任何剩余的参数都不是选项(尽管如果在起点列表中使用通配符,请确保所有起点以“./” 或“/”开头通常更安全)。
-P 不跟随在软链接后边。这是默认行为。当 find 检测或打印一个软链接文件时, 所使用的信息应取自软链接本身的属性。
-L 跟随在软链接后边。当 find 检测或打印一个文件时,所使用的信息应取自软链 接指向的文件的属性(除非软链接已损坏或 find 不能检测软链接指向的文 件)。使用此选项意味着 -noleaf。 如果以后使用 -P 选项,-noleaf 仍然有效。 如果 -L 有效并且 find 在其搜索过程中发现到子目录的软链接,则将搜索软链 接指向的子目录。当 -L 选项生效时,-type 谓词将始终匹配软链接指向的文件 类型而不是链接本身(除非软链接被破坏)。 执行 find 时可能导致软链接断开 的操作(例如 -delete)可能会导致混淆行为。 使用 -L 会导致 -lname 和 -ilname 谓词始终返回 false。
-H 不要跟随软链接,除非在处理命令行参数时。 当 find 检查或打印有关文件的信 息时,所使用的信息应取自软链接本身的属性。 此行为的唯一例外是命令行上 指定的文件是软链接,并且可以解析该链接。 对于这种情况,所使用的信息取 自链接指向的任何内容(即遵循链接)。 如果无法检查软链接指向的文件,则 有关链接本身的信息将用作后备。 如果 -H 有效并且命令行上指定的路径之一 是指向目录的软链接,则将检查该目录的内容(当然 -maxdepth 0 会阻止这种 情况)。
如果指定了 -H、-L 和 -P 中的多个,则每个都覆盖其他;命令行上出现的最后一个生 效。 由于是默认设置,除非指定了 -H 或 -L,否则 -P 选项应被视为有效。在任何搜索 开始之前,GNU 在命令行本身的处理过程中经常查找 stats 文件。 这些选项也会影响 这些参数的处理方式。 具体来说,有许多测试将命令行中列出的文件与我们当前正在 考虑的文件进行比较。 在每种情况下,都将检查命令行上指定的文件并保存其某些属 性。如果命名文件实际上是一个软链接,并且 -P 选项有效(或者如果没有指定 -H 和 -L),则用于比较的信息将从软链接的属性中获取。 否则,它将从链接指向的文件的 属性中获取。 如果 find 无法跟随链接(例如,因为它没有足够的权限或链接指向不存 在的文件),则将使用链接本身的属性。当 -H 或 -L 选项生效时,作为 -newer 参数列 出的任何软链接都将被取消引用,并且时间戳将从软链接指向的文件中获取。 同样的 考虑适用于 -newerXY、-anewer 和 -cnewer。-follow 选项与 -L 的效果类似,尽管它在 它出现的地方生效(也就是说,如果没有使用 -L 但使用了 -follow,则命令行上出现在 -follow 之后的任何软链接都将是取消引用,而之前的那些不会)。
-D debugopts
打印诊断信息; 这有助于诊断为什么 find 没有做你想要的问题。调试选项列表应 以逗号分隔。findutils 版本之间不保证调试选项的兼容性。有关有效调试选项的完 整列表,请参阅 find -D help 的输出。有效的调试选项包括:
exec 展示 -exec、-execdir、-ok、-okdir 的诊断信息。
opt 打印表达式树的优化的诊断信息;请参阅 -O 选项。
rates 打印指示每个谓词成功或失败的频率的摘要。
search 详细浏览目录树。
stat 在使用 stat 和 lstat 系统调用检查文件时打印消息。 find 程序会尽量减少 此类调用。
tree 以原始和优化的形式显示表达式树。
all 启用所有其他调试选项(不包括 help)。
help 调试选项的帮助文档。
-Olevel
启用查询优化。 find 程序重新排序测试以加快执行速度,同时保持整体效果; 也 就是说,具有副作用的谓词不会相对于彼此重新排序。在每个优化级别执行的优 化如下:
0 等于1。
1 这是默认优化级别,对应于传统行为。表达式被重新排序,以便首先执行仅 基于文件名(例如 -name 和 -regex)的测试。
2 任何 -type 或 -xtype 测试都在任何仅基于文件名的测试之后执行,但在任何 需要来自 inode 的信息的测试之前执行。 在许多现代版本的 Unix 上,文件 类型由 readdir() 返回,因此这些谓词的评估速度比需要先统计文件的谓词 更快。 如果你使用 -fstype FOO 谓词并指定在 find 开始时未知的文件系统 类型 FOO(即,存在于 '/etc/mtab' 中),则该谓词等效于 -false。
3 在此优化级别,启用了基于成本的完整查询优化器。 修改测试顺序,以便 先执行廉价(即快速)测试,然后在必要时执行更昂贵的测试。 在每个成 本范围内,根据它们是否可能成功来早晚评估谓词。 对于 -o,更早评估可 能成功的谓词,而对于 -a,更早评估可能失败的谓词。
表达式
起始点列表之后的命令行部分是表达式。 这是一种查询规范,描述了我们如何匹配文 件以及我们如何处理匹配的文件。 表达式由一系列事物组成:
测试 测试返回 true 或 false 值,通常基于我们正在考虑的文件的某些属性。 例如 -empty 测试仅在当前文件为空时才为真。
动作 动作有副作用(例如在标准输出上打印一些东西)并返回真或假,通常取决 于它们是否成功。例如 -print 操作在标准输出上打印当前文件的名称。
全局选项 全局选项影响在命令行的任何部分指定的测试和动作的操作。全局选项总是 返回 true。 例如,-depth 选项使 find 以深度优先的顺序遍历文件系统。
位置选项 位置选项仅影响跟随它们的测试或动作。位置选项总是返回 true。 例如, -regextype 选项是位置选项,它为稍后出现在命令行上的正则表达式指定正 则表达式方言。
运算符 运算符将表达式中的其他项连接在一起。 例如,它们包括 -o(表示逻辑 OR)和 -a(表示逻辑 AND)。 如果缺少运算符,则假定为 -a。
-print 操作对整个表达式为真的所有文件执行,除非它包含除 -prune 或 -quit 之外的操 作。禁止默认 -print 的操作是 -delete、-exec、-execdir、-ok、-okdir、-fls、-fprint、 -fprintf、-ls、-print 和 -printf。-delete 操作也像一个选项(因为它暗示 -depth)。
位置选项
位置选项总是返回 true。它们仅影响稍后在命令行上发生的测试。
-daystart
从今天开始而不是 24 小时前测量时间(对于 -amin、-atime、-cmin、-ctime、 -mmin 和 -mtime)。 此选项仅影响稍后出现在命令行上的测试。
-follow
已弃用; 请改用 -L 选项。
-regextype type
更改 -regex 和 -iregex 测试理解的正则表达式语法,这些测试稍后出现在命令行 上。 要查看已知的正则表达式类型,请使用 -regextype help。
-warn, -nowarn
打开或关闭警告消息。 这些警告仅适用于命令行使用,不适用于 find 在搜索目录 时可能遇到的任何情况。 如果标准输入是 tty,则默认行为对应于 -warn,否则对 应于 -nowarn。 如果产生与命令行使用相关的警告消息,则 find 的退出状态不受 影响。 如果设置了 POSIXLY_CORRECT 环境变量,并且还使用了 -warn,则不 会指定哪些警告(如果有)将处于活动状态。
全局选项
全局选项总是返回 true。全局选项甚至对较早在命令行上发生的测试也有效。为防止混 淆,全局选项应在开始点列表之后的命令行中指定,就在第一次测试、位置选项或动作 之前。 如果您在其他地方指定全局选项, find 将发出警告消息,说明这可能会造成混 淆。例如,全局选项出现在起点列表之后,因此与 -L 不是同一种选项。
-d -depth 的同义词,与 FreeBSD、Net-BSD、MacOS X 和 OpenBSD 兼容。
-depth 在目录本身之前处理每个目录的内容。-delete 操作也意味着 -depth。
-help,--help
打印 find 的命令行用法摘要并退出。
-ignore_readdir_race
通常, find 无法统计文件时会发出错误消息。 如果您提供此选项并且在 find 从 目录中读取文件名和尝试统计文件之间删除了文件,则不会发出错误消息。 这 也适用于名称在命令行中给出的文件或目录。 此选项在读取命令行时生效,这 意味着您无法在打开此选项的情况下搜索文件系统的一部分而关闭此选项的部 分(如果需要这样做,则需要发出两个 find 命令代替,一个有选项,一个没有 它)。此外,带有 -ignore_readdir_race 选项的 find 将忽略 -delete 操作的错 误,以防文件自读取父目录后消失:它不会输出错误诊断,并且 -delete 操作的 返回码将为 true 。
-maxdepth levels
在低于级别(非负整数)的级别应用测试或动作。 -maxdepth 0 表示仅 将测试和动作应用于起点本身。
-mindepth levels
不要在低于级别(非负整数)的级别应用任何测试或动作。 -mindepth 1 表示处 理除起始点之外的所有文件。
-mount
不要应用于其他文件系统上的目录。-xdev 的替代名称,用于与某些其他版本的 find 兼容。
-noignore_readdir_race
去掉 -ignore_readdir_race 的效果。
-noleaf
不要通过假设目录包含的子目录比它们的硬链接数少 2 来优化。 搜索不遵循 Unix 目录链接约定的文件系统时需要此选项,例如 CD-ROM 或 MS-DOS 文件 系统或 AFS 卷安装点。 普通 Unix 文件系统上的每个目录至少有 2 个硬链接: 它的名称和它的“.”。 入口。 此外,它的每个子目录(如果有)都有一个链接到 该目录的“..”条目。 当 find 正在检查一个目录时,在它统计的子目录比目录的链 接数少 2 个之后,它知道目录中的其余条目是非目录(目录树中的“叶”文件)。 如果只需要查看文件名,则无需统计; 这显着提高了搜索速度。
-version, --version
打印 find 版本号后退出。
-xautofs
不要应用于 autofs 文件系统上的目录。
-xdev 不要应用于其他文件系统上的目录。
测试
某些测试,例如 -newerXY 和 -samefile,允许将当前正在检查的文件与命令行中指定 的某个参考文件进行比较。 使用这些测试时,参考文件的解释由选项 -H、-L 和 -P 以 及任何之前的 -follow 决定,但参考文件仅在解析命令行时检查一次。 如果无法检查参 考文件(例如,stat 系统调用失败),则会发出错误消息,并且 find 以非零状态退出。
数字变量可以这样指定:
+n 比 n 大
-n 比 n 小
n n
-amin n 最后访问时间在 n 分钟之前的文件。
-anewer reference
当前文件的最后访问时间比参考文件的最后数据修改时间更近。 如果引用 是软链接并且 -H 选项或 -L 选项有效,则始终使用它指向的文件的最后 一次数据修改时间。
-atime n 文件最后一次访问是在 n*24 小时前。 当 find 计算出该文件在多少 24 小 时前被上次访问时,任何小数部分都将被忽略,因此要匹配 -atime +1,文 件必须至少在两天前被访问过。
-cmin n 最后修改时间在 n 分钟之前的文件。
-cnewer reference
当前文件的最后修改时间比参考文件的最后数据修改时间更近。 如果引用 是软链接并且 -H 选项或 -L 选项有效,则始终使用它指向的文件的最后 一次数据修改时间。
-ctime n 文件最后一次修改是在 n*24 小时前。请参阅 -atime 的注释以了解舍入如 何影响文件状态更改时间的解释。
-empty 文件为空且是普通文件或目录。
-executable 匹配可执行文件和当前用户可搜索(在文件名解析意义上)的目录。 这考 虑了 -perm 测试忽略的访问控制列表和其他权限。 该测试使用 了 access 系统调用,因此可能会被执行 UID 映射(或根压缩)的 NFS 服务器所欺骗,因为许多系统在客户端内核中实现了 access,因此无法 使用服务器上保存的 UID 映射信息。 由于此测试仅基于 access 系统调 用的结果,因此无法保证此测试成功的文件确实可以执行。
-false 总是 false。
-fstype type 文件位于类型为 type 的文件系统上。有效的文件系统类型因 Unix 版本而 异; 在某些版本的 Unix 或其他版本上接受的文件系统类型的不完整列表 是:ufs、4.2、4.3、nfs、tmp、mfs、S51K、S52K。 您可以将 -printf 与 %F 指令一起使用来查看文件系统的类型。
-gid n 文件的组ID 是 n。
-group gname
属于 gname 组的文件(使用数字组ID也可以)。
-ilname pattern
类似 -lname,但是大小不敏感。如果 -L 或 -follow 选项生效,除非软链接 已损坏,这个测试返回 false。
-iname pattern
类似 -name,但是大小写不敏感。比如,'fo*' 和 'F??' 匹配的文件有 'Foo'、'FOO'、'foo'、'fOo' 等等。'*foo*' 可以匹配 '.foobar'。
-inum n inode 是 n 的文件。一般使用 -samefile 测试来代替会更简单。
-ipath pattern
类似 -path,但是大小写不敏感。
-iregex pattern
类似 -regex,但是大小写不敏感。
-iwholename pattern
请参见 -ipath。此替代方案的灵活性不如 -ipath。
-links n
文件有 n 个硬链接。
-lname pattern
文件是一个符号链接,其内容匹配 shell 模式 pattern。 元字符不特别处理 “/”或“.” 。 如果 -L 选项或 -follow 选项有效,则除非软链接断开,否则此 测试将返回 false。
-mmin n
文件最后修改是在 n 分钟之前。
-mtime n
文件最后修改是在 n*24 小时之前。请参阅 -atime 的注释以了解舍入如 何影响文件状态更改时间的解释。
-name pattern
文件名的基础(删除了前导目录的路径)匹配 shell 模式模式。因为前导 目录被删除,考虑与 -name 匹配的文件名将永远不会包含斜杠,所以 '-name a/b' 永远不会匹配任何东西(你可能需要使用 -path 代替)。如果 您尝试这样做,则会发出警告,除非设置了环境变量 POSIXLY_CORRECT。元字符(`*'、`?' 和 `[]')匹配一个 `.'在基本名称 的开头(这是 findutils-4.2.2 中的更改;请参阅下面的标准一致性部 分)。要忽略目录及其下的文件,请使用 -prune 而不是检查树中的每个 文件;请参阅该操作说明中的示例。尽管事实上包括 Bash 在内的一些 shell 在 shell 模式中赋予了括号具有特殊意义,但大括号并不被认为是特 殊的。使用 fnmatch(3) 库函数执行文件名匹配。不要忘记用引号将模式 括起来,以保护它不被 shell 扩展。
-newer reference
当前文件最后一次修改数据的时间比文件 reference 最后一次修改数据的 时间晚。 如果 reference 是软链接并且 -H 选项或 -L 选项有效,则始终 使用它指向的文件的最后一次数据修改时间。
-newerXY reference
如果正在考虑的文件的时间戳 X 比文件 reference 的时间戳 Y 新,则成 功。 字母 X 和 Y 可以是以下任一字母:
a 文件 reference 的访问时间
B 文件 reference 的创建时间
c reference 的 inode 状态的修改时间
m 文件 reference 的修改时间
t reference 被直接解释为时间
某些组合无效;例如,X 为 t 是无效的。 某些组合并非在所有系统上都 实现; 例如,并非所有系统都支持 B。 如果指定了无效或不受支持的 XY 组合,则会导致致命错误。 时间规范被解释为 GNU 日期的 -d 选项 的参数。 如果你尝试使用参考文件的创建时间,但无法确定创建时间, 则会产生致命错误消息。如果你指定测试是指正在检查的文件的创建时 间,则对于任何创建时间未知的文件,此测试都将失败。
-nogroup 没有与文件的数字组ID对应的组。
-nouser 没有与文件的数字用户ID对应的用户。
-path pattern 文件名匹配 shell 模式模式。元字符不处理“/”或“.”特别;所以,例如,
find . -path "./sr*sc"
将为名为“./src/misc”的目录打印一个条目(如果存在)。要忽略整个目 录树,请使用 -prune 而不是检查树中的每个文件。请注意,模式匹配测 试适用于整个文件名,从命令行上指定的起点之一开始。如果相关起点 也是绝对路径,则在此处使用绝对路径名才有意义。这意味着此命令永 远不会匹配任何内容:
find bar -path /foo/bar/myfile -print
find 将 -path 参数与目录名称和它正在检查的文件的基本名称的串联进 行比较。由于串联永远不会以斜杠结束,因此以斜杠结尾的 -path 参数 将不匹配任何内容(除了在命令行中指定的起点)。 HP-UX find 也支 持谓词 -path,它是 POSIX 2008 标准的一部分。-perm mode 文件的权限位由 mode(八进制或符号)设置。由于需要精确匹配,如 果你想将这种形式用于符号模式,你可能必须指定一个相当复杂的 mode 字符串。 例如,`-perm g=w' 将只匹配 mode 为 0020 的文件(即 组写权限是唯一权限集的文件)。你更有可能希望使用“/”或“-”形式,例 如“-perm -g=w”,它匹配具有组写权限的任何文件。有关一些说明性示 例,请参阅示例部分。
-perm -mode mode 为文件设置了所有权限位。符号 mode 以这种形式被接受,这通 常是你希望使用它们的方式。如果使用符号 mode ,则必须指定'u'、 'g'或'o'。有关一些示例,请参见示例部分。
-perm /mode 为文件设置任何权限位 mode。这种形式接受符号 mode。如果使用符 号 mode,则必须指定'u'、'g'或'o'。有关一些示例,请参见示例部分。 如果 mode 中未设置权限位,则此测试将匹配任何文件(此处的想法是 与-perm-000的行为一致)。
-readable 匹配当前用户可读的文件。这将考虑访问控制列表和-perm测试忽略的 其他权限人工制品。此测试使用 access 系统调用,因此可以被执行UID 映射(或根压缩)的NFS服务器愚弄,因为许多系统在客户端内核中实 现 access,因此无法使用服务器上保存的UID映射信息。
-regex pattern 文件名与正则表达式 pattern 匹配。这是整个路径上的匹配,而不是搜 索。例如,匹配名为'./fubar3'的文件,您可以使用正则表达式 '.*bar.' 或.*b.*3',但不是'f.*r3'。find 所理解的正则表达式在默认情况下是 Emacs正则表达式(除了“.”与换行符匹配外),但这可以通过 -regextype 选项进行更改。
-samefile name
文件引用与 name 相同的inode。当-L生效时,这可以包括软链接。
-size n[cwbkMG]
文件使用 n 个空间单位,四舍五入。可以使用以下后缀:
'b' 512字节块(如果未使用后缀,则为默认值)
'c' 字节
'w' 两字节词
'k' kb(1024字节)
'M' mb(1048576字节)
'G' gb(1073741824字节)
大小只是由lstat(或stat)系统调用填充的struct stat的st_size成员,如 上所示向上取整。换句话说,它与 ls -l 的结果一致。请记住,-printf的 '%k'和'%b'格式说明符处理稀疏文件的方式不同。'b'后缀始终表示512 字节块,而从不表示1024字节块,这与-ls的行为不同。+和-前缀通常表 示大于和小于;例如, n个确切大小不匹配的单位。请记住,大小将四舍 五入到下一个单位。因此 -size -1M 不等于 -size -1048576c。前者只匹 配空文件,后者匹配0到1048575字节的文件。
-true 永远是 true.
-type c 类型为 c 的文件:
b 块(缓冲)特殊
c 字符(非缓冲)特殊
d 目录
p 命名的管道(先进先出)
f 常规文件
l 软链接,如果-L选项或-follow选项有效,则永远不会出现这种情 况,除非软链接断开。如果要在-L生效时搜索符号链接,请使用 -xtype。
s 套接字。
D 门(Solaris)
搜索多种类型,可以把类型符号用逗号隔开。(GNU扩展)
-uid n 文件的数字用户ID是 n。
-used n 文件最后一次访问是在最后修改状态之后的 n 天。
-user uname 文件的属主是用户 uname (数字用户ID是允许的)。
-wholename pattern
请参见 -path。此替代方案的灵活性不如 -path。
-writable 匹配当前用户可写的文件。这将考虑访问控制列表和 -perm 测试忽略的 其他权限。此测试使用 access 系统调用,因此可以被执行UID映射 (或根压缩)的NFS服务器愚弄,因为许多系统在客户端内核中实现 access,因此无法使用服务器上保存的UID映射信息。
-xtype c 与-type相同,除非文件是软链接。对于软链接:如果指定了-H或-P选 项,则如果文件是指向 c 类型文件的链接,则为true;如果已给出-L选 项,则如果c为'L',则为true。换句话说,对于软链接,-xtype检查-type 未检查的文件类型。
-context pattern
(SELinux专属)文件的安全上下文匹配 glob pattern。
动作
-delete 删除文件。如果成功则返回 true。如果失败返回错误信息,退出状态非 0。使用 -delete 会自动打开 '-depth'。警告:不要忘记 find 命令行被评 估为表达式,因此将 -delete 放在首位将使 find 尝试删除您指定的起点 以下的所有内容。 在测试稍后打算与 -delete 一起使用的 find 命令行 时,你应该明确指定 -depth 以避免以后出现意外。 因为 -delete 暗示 -depth,所以不能有效地将 -prune 和 -delete 一起使用。与 -ignore_readdir_race 选项一起,在读取父目录后文件消失的情况下, find 将忽略 -delete 操作的错误:它不会输出错误诊断,并且 -delete 操 作的返回码将为 true。
-exec command ;
执行 command; 如果返回 0 状态,则为 true。 find 的所有以下参数 都被视为命令的参数,直到遇到包含“;” 的参数。 字符串“{}”被当前正在 处理的文件名替换,它出现在 command 的参数中的任何地方,而不仅 仅是在某些版本的 find 中单独出现在参数中。 这两种结构都可能需要 转义(使用“\”)或引用以防止它们被 shell 扩展。 有关使用 -exec 选项 的示例,请参见示例部分。 指定的命令对每个匹配的文件运行一次。 该命令在起始目录中执行。 使用 -exec 操作存在不可避免的安全问 题;你应该改用 -execdir 选项。
-exec command {} +
-exec 动作的这种变体在选定的文件上运行指定的命令,但命令行是通 过在每个选定的文件名后附加来构建的;命令的总调用次数将远小于 匹配文件的数量。 命令行的构建方式与 xargs 构建其命令行的方式非 常相似。 命令中只允许出现一个“{}”实例,并且(当 find 是从 shell 调 用时)它应该被引用(例如,“{}”)以保护它不被 shell 解释。 该命令 在起始目录中执行。 如果任何带有“+”形式的调用返回一个非零值作为 退出状态,则 find 返回一个非零退出状态。 如果 find 遇到错误,这有 时会导致立即退出,因此一些挂起的命令可能根本无法运行。 -exec 的 这个变体总是返回真。
-execdir command ;
-execdir command {} +
与 -exec 类似,但指定的命令是从包含匹配文件的子目录中运行的,该 子目录通常不是您开始查找的目录。与 -exec 一样,如果从 shell 调用 find,则应引用 {}。这是一种更安全的调用命令的方法,因为它在解析 匹配文件的路径期间避免了竞争条件。与 -exec 操作一样,-execdir 的 “+”形式将构建一个命令行来处理多个匹配的文件,但任何给定的命令 调用只会列出存在于同一子目录中的文件。如果你使用这个选项,你必 须确保你的 $PATH 环境变量没有引用“.”;否则,攻击者可以通过在您 将运行 -execdir 的目录中留下一个适当命名的文件来运行他们喜欢的任 何命令。这同样适用于 $PATH 中为空或不是绝对目录名称的条目。如 果任何带有“+”形式的调用返回一个非零值作为退出状态,则 find 返回 一个非零退出状态。如果 find 遇到错误,这有时会导致立即退出,因此 一些挂起的命令可能根本无法运行。动作的结果取决于是 + 还是 ;正在 使用变体; -execdir command {} + 总是返回 true,而 -execdir command {} ;仅当 command 返回 0 时才返回 true。
-fls file 为真; 类似 -ls 但写入文件类似 -fprint。 输出文件总是被创建,即使谓词 从不匹配。 有关如何处理文件名中的异常字符的信息,请参阅 异常文件名 部分。
-fprint file 为真; 将完整的文件名打印到文件 file 中。 如果运行 find 时文件不存 在,则创建它; 如果确实存在,则将其截断。 文件名'/dev/stdout' 和 '/dev/stderr' 被特殊处理; 它们分别指的是标准输出和标准错误输出。 输出文件总是被创建,即使谓词从不匹配。 有关如何处理文件名中的异 常字符的信息,请参阅 异常文件名 部分。
-fprint0 file 为真; 类似 -print0 但写入文件类似 -fprint。 输出文件总是被创建,即使 谓词从不匹配。 有关如何处理文件名中的异常字符的信息,请参阅 异 常文件名 部分。
-fprintf file format
为真; 类似 -printf 但写入文件类似 -fprint。 输出文件总是被创建,即使 谓词从不匹配。 有关如何处理文件名中的异常字符的信息,请参阅 异常文件名 部分。
-ls 为真; 在标准输出上以 ls -dils 格式列出当前文件。 块计数为 1 KB 块, 除非设置了环境变量 POSIXLY_CORRECT,在这种情况下使用 512 字 节块。 有关如何处理文件名中的异常字符的信息,请参阅 异常文件 名 部分。
-ok command 类似 -exec 但首先询问用户。 如果用户同意,则运行该命令。 否则就 返回false。 如果运行该命令,其标准输入将从 /dev/null 重定向。对提 示的响应与一对正则表达式进行匹配,以确定它是肯定响应还是否定响 应。 如果设置了“POSIXLY_CORRECT”环境变量,则该正则表达式将 从系统获得,否则从 find 的消息翻译中获得。如果系统没有合适的定 义,则会使用 find 自己的定义。 在任何一种情况下,正则表达式本身的 解释都会受到环境变量“LC_CTYPE”(字符类)和“LC_COLLATE”(字 符范围和等价类)的影响。
-okdir command ;
与 -execdir 类似,但首先以与 -ok 相同的方式询问用户。 如果用户不同 意,就返回false。 如果运行该命令,其标准输入将从 /dev/null 重定向。
-print 为真;在标准输出上打印完整的文件名,后跟换行符。 如果你将 find 的输出传送到另一个程序中,并且您正在搜索的文件可能包含换行符的 可能性很小,那么你应该认真考虑使用 -print0 选项而不是 -print。 有关 如何处理文件名中的异常字符的信息,请参阅 异常文件名 部分。
-print0 为真;在标准输出上打印完整的文件名,后跟一个空字符(而不是 -print 使用的换行符)。 这允许处理查找输出的程序正确解释包含换行 符或其他类型空格的文件名。 此选项对应于 xargs 的 -0 选项。
-printf format 为真;在标准输出上打印格式,解释“\”转义符和“%”指令。 可以使用 'printf' C 函数指定字段宽度和精度。 请注意,许多字段被打印为 %s 而 不是 %d,这可能意味着标志不会像您预期的那样工作。 这也意味着“-” 标志确实有效(它强制字段左对齐)。与 -print 不同,-printf 不会在字 符串末尾添加换行符。 转义和指令是:
\a 警告铃。
\b 退格。
\c 立即停止使用当前格式打印,并刷新输出。
\f 换页符。
\n 换行符。
\r 回车。
\t 水平制表符。
\v 垂直制表符。
\0 ASCII NUL。
\\ 反斜杠。
\NNN ASCII码为NNN(八进制数)的字符。
一个反斜杠后边加上任意字符,会打印出这个字符。
%% 百分号。
%a 文件的最后访问时间,格式为 C 'ctime' 函数返回的格式。
%Ak 文件的上次访问时间,采用 k 指定的格式,它可以是 '@' 或 C 函 数 'strftime' 的指令。 下面列出了 k 的可能值; 由于系统之 间'strftime'的差异,其中一些可能并非在所有系统上都可用。
@ GMT1970年1月1日00:00以来的秒数,有分数部分。
时间字段:
H 时(00..23)
I(大写i) 时(01..12)
k 时(0..23)
l(小写L) 时(1..12)
M 分(00..59)
p 当地的上下午(AM/PM)
r 时间,12小时制(hh:mm:ss [AP]M)
S 秒(00.00 .. 61.00)有分数部分。
T 时间,24小时制(hh:mm:ss.xxxxxxxxxx)
+ 日期和时间,以“+”分隔,例如 “2004-04-28+22:22:05.0”。 这是一个 GNU 扩展。 时间以当前时区给出(可能会受到设置 TZ 环境变量 的影响)。秒字段包括小数部分。
X 当地时间(H:M:S)。秒字段包括分数部分。
Z 时区(例如 EDT),或者如果没有确定时区则不配 置值。
日期字段:
a 当地的星期几的缩写(Sun..Sat)
A 当地的星期几的名称(Sunday..Saturday)
b 当地的月份的缩写(Jan..Dec)
B 当地的月份的名称(January..December)
c 当地的日期和时间(Thu Dec 23 12:02:33
CST 2021)。格式与 ctime 相同,为了保持与该格式的兼 容性,秒字段没有分数部分。d 一个月中的第几天(01..31)
D 日期(mm/dd/yy)
h 等于b
j 一年中的第几天(001..366)
m 月(01..12)
U 一年中的第几周,周日作为每周的第一天。(00..53)
w 一周中的第几天(0..6)
W 一年中的第几周,周一作为每周的第一天。(00..53)
x 当地日期(mm/dd/yy)
y 年的后两位(00..99)
Y 年(1970...)
%b 用于此文件的磁盘空间量,以 512 字节块为单位。 由于磁盘空间 以文件系统块大小的倍数分配,这通常大于 %s/512,但如果文件 是稀疏文件,它也可以更小。
%c 文件的上次状态更改时间,格式为 C 'ctime' 函数返回。
%Ck k 指定的格式的文件的最后状态更改时间,与 %A 相同。
%d 文件在目录树中的深度; 0 表示该文件是一个起点。
%D 文件所在的设备编号(struct stat 的 st_dev 字段),以十进制 表示。
%f 删除任何前导目录的文件名(仅最后一个元素)。
%F 文件所在的文件系统类型; 此值可用于 -fstype。
%g 文件的组名,如果组没有名称,则为数字组 ID。
%G 文件的数字组 ID。
%h 文件名的前导目录(除最后一个元素外的所有目录)。 如果文件 名不包含斜杠(因为它在当前目录中),%h 说明符扩展为“.”。
%H 找到文件的起点。
%i 文件的 inode (十进制)。
%k 用于此文件的磁盘空间量,以 1 KB 块为单位。 由于磁盘空间以 文件系统块大小的倍数分配,这通常大于 %s/1024,但如果文件 是稀疏文件,它也可以更小。
%l 软链接的对象(如果文件不是软链接,则为空字符串)。
%m 文件的权限位(八进制)。此选项使用大多数 Unix 实现使用的 “传统”数字,但如果您的特定实现使用八进制权限位的不寻常顺 序,您将看到文件模式的实际值与 %m 的输出之间的差异。通常 你会希望在这个数字上有一个前导零,为此,你应该使用 # 标志 (例如,'%#m')。
%M 文件的权限(符号形式)。findutils 4.2.5及更高版本支持此指 令。
%n 文件的硬链接数。
%p 文件名。
%P 文件名和被删除的起始点的名字。
%s 文件的大小,以字节为单位。
%S 文件的稀疏度。这计算为 (BLOCKSIZE*st_blocks / st_size)。 对 于特定长度的普通文件,您将获得的确切值取决于系统。 但是, 通常稀疏文件的值将小于 1.0,使用间接块的文件的值可能大于 1.0。 通常,文件使用的块数取决于文件系统。 用于 BLOCKSIZE 的值取决于系统,但通常为 512 字节。 如果文件大小为零,则打 印的值未定义。 在不支持 st_blocks 的系统上,假设文件的稀疏 度为 1.0。
%t 文件的最后修改时间,格式为 C 'ctime' 函数返回的格式。
%Tk k 指定的格式的文件的最后修改时间,与 %A 相同。
%u 文件的用户名,如果用户没有姓名,则为数字用户 ID。
%U 文件的数字用户 ID。
%y 文件类型
%Y 文件类型,加上跟随的符号链接:'L'=loop,'N'=nonexistent, '?' 用来确定符号链接目标类型时的任何其他错误。
%Z (SELinux 专属)文件的安全上下文。
%{ %[ %(
未来使用的保留符号。
后接任何其他字符的“%”字符将被丢弃,但会打印另一个字符(不要依 赖于此,因为可能会引入更多格式字符)。格式参数末尾的“%”会导致 未定义的行为,因为没有后续字符。在某些地区,它可能会隐藏你的 门钥匙,而在其他地区,它可能会删除你正在阅读的小说的最后一页。
%m 和 %d 指令支持 # 、 0 和 + 标志,但其他指令不支持,即使它们打 印数字。 不支持这些标志的数字指令包括 G、U、b、D、k 和 n。 支持 “-”格式标志并将字段的对齐方式从右对齐(这是默认值)更改为左对 齐。
有关如何处理文件名中的异常字符的信息,请参阅 异常文件名 部分。
-prune 为真; 如果文件是目录,则不要进入该目录。如果给出了 -depth,则 -prune 无效。 因为 -delete 暗示 -depth,所以不能有效地将 -prune 和 -delete 一起 使用。 例如,要跳过目录“src/emacs”及其下的所有文件和目录,并打印找 到的其他文件的名称,请执行以下操作:
find . -path ./src/emacs -prune -o -print-quit 立即退出。不会有任何子进程继续运行,但不会处理命令行上指定的更多路 径。 例如,find /tmp/foo /tmp/bar -print -quit 将只打印 /tmp/foo。任何使用 -execdir ... {} + 构建的命令行都将在 find 退出之前被调用。退出状态可能为 零,也可能不为零,具体取决于是否已发生错误。
运算符
按优先级降序排列:
( expr )
强制优先。 由于括号对于 shell 是特殊的,你通常需要引用它们。本手册页中的许 多示例为此目的使用反斜杠:“\(...\)”而不是“(...)”。
! expr
如果 expr 为假,则为真。 这个字符通常也需要保护不被 shell 解释。
-not expr
等于 ! expr ,但不符合 POSIX。
expr1 expr2
连续两个表达式被认为是用隐含的 -a 连接的; 如果 expr1 为假,则不评估 expr2。
expr1 -a expr2
等于 expr1 expr2。
expr1 -and expr2
等于 expr1 expr2,但不符合 POSIX。
expr1 -o expr2
或;如果 expr1 为真,则不评估 expr2。
expr1 -or expr2
等于 expr1 -o expr2,但不符合 POSIX。
expr1 , expr2
列表; expr1 和 expr2 总是被评估。expr1 的值被丢弃;列表的值是 expr2 的值。 逗号运算符可用于搜索几种不同类型的事物,但仅遍历文件系统层次结构一次。 -fprintf 操作可用于将各种匹配项列出到几个不同的输出文件中。
请注意,-a 在隐式指定时(例如通过两个测试之间没有显式运算符出现)或显式指定 时比 -o 具有更高的优先级。 这意味着 find . -name afile -o -name bfile -print 永远不会 打印文件。
异常文件名
find 的许多操作都会打印受其他用户控制的数据。这包括文件名、大小、修改时间等。 文件名是一个潜在的问题,因为它们可以包含除“\0”和“/”之外的任何字符。文件名中的 不寻常字符会对你的终端产生意想不到且通常不受欢迎的事情(例如,更改某些终端上 功能键的设置)。如下所述,各种操作对异常字符的处理方式不同。
-print0,-fprint0
始终打印准确的文件名,不变,即使输出到终端。
-ls,-fls
不寻常的字符总是被转义。空格、反斜杠和双引号字符使用 C 风格的转义字符打 印(例如`\f'、`\"')。其他不常见的字符使用八进制转义字符打印。其他可打印字 符(对于 -ls 和 -fls 这些是八进制 041 和 0176 之间的字符)按原样打印。
-printf,-fprintf
如果输出没有到达终端,则按原样打印。否则,结果取决于正在使用的指令。指 令 %D、%F、%g、%G、%H、%Y 和 %y 扩展为不受文件所有者控制的值,因 此按原样打印。指令 %a、%b、%c、%d、%i、%k、%m、%M、%n、%s、 %t、%u 和 %U 具有受文件所有者控制的值,但不能用于向终端发送任意数据, 因此这些数据按原样打印。指令 %f、%h、%l、%p 和 %P 被括起来。这种执行 方式与 GNU ls 相同。这与用于 -ls 和 -fls 的机制不同。如果你能够决定使用什么 格式用于 find 的输出,那么使用 `\0' 作为终止符通常比使用换行符更好,因为文 件名可以包含空格和换行符。'LC_CTYPE' 环境变量的设置用于确定需要括哪些 字符。
-print,-fprint
引用的处理方式与 -printf 和 -fprintf 相同。 如果你在脚本中使用 find 或在匹配文 件可能具有任意名称的情况下使用,你应该考虑使用 -print0 而不是 -print。
-ok 和 -okdir 操作按原样打印当前文件名。 这可能会在未来的版本中改变。
环境变量
LANG
为未设置或为空的国际化变量提供默认值。
LC_ALL
如果设置为非空字符串值,则覆盖所有其他国际化变量的值。
LC_COLLATE
POSIX 标准指定此变量影响用于 -name 选项的模式匹配。 GNU find 使用 fnmatch 库函数,因此对“LC_COLLATE”的支持取决于系统库。这个变量也影响对 -ok 响应的解释;虽然`LC_MESSAGES'变量选择用于解释对-ok的响应的实际模 式,模式中任何括号表达式的解释都将受到`LC_COLLATE'的影响。
LC_CTYPE
如果系统的 fnmatch 库函数支持此变量,则此变量会影响正则表达式中使用的字 符类的处理以及 -name 测试。此变量还影响用于解释对 -ok 发出的提示的响应的 正则表达式中任何字符类的解释。'LC_CTYPE' 环境变量也会影响在打印文件名时 哪些字符被认为是不可打印的;请参阅 异常文件名 部分。
LC_MESSAGES
确定用于国际化消息的区域设置。 如果设置了“POSIXLY_CORRECT”环境变量, 这也决定了对 -ok 操作做出的提示的响应的解释。
NLSPATH
确定国际化消息目录的位置。
PATH
影响为查找由 -exec、-execdir、-ok 和 -okdir 调用的可执行文件而搜索的目录。
POSIXLY_CORRECT
确定 -ls 和 -fls 使用的块大小。如果设置了 POSIXLY_CORRECT,则块以 512 字 节为单位。 否则它们是 1024 字节的单位。默认情况下,设置此变量还会关闭警 告消息(即,隐含 -nowarn),因为 POSIX 要求除了 -ok 的输出之外,所有打印 在 stderr 上的消息都是诊断信息,并且必须导致非零退出状态。 当 POSIXLY_CORRECT 未设置时,如果 +zzz 不是有效的符号模式,则 -perm +zzz 被视为 -perm /zzz。设置 POSIXLY_CORRECT 时,此类构造将被视为错误。当 设置了 POSIXLY_CORRECT 时,对 -ok 操作做出的提示的响应将根据系统的消 息目录进行解释,而不是根据 find 自己的消息翻译。
TZ
影响用于 -printf 和 -fprintf 的某些与时间相关的格式指令的时区。
退出状态
如果已成功处理所有文件,则 find 的退出状态为0,如果发生错误,则大于0。 这是刻 意的非常广泛的描述,但如果返回值是非零,则不应依赖 find 结果的正确性。发生某 些错误时,find 可能会立即停止,而无需完成指定的所有操作。 例如,可能未经检查 某些起始点或可能未执行用于 -exec ... {} +或 -execdir ... {} + 的一些待处理程序调用。
使用实例:
1. 在目录/tmp 中或目录下查找名为core 的文件并删除它们。 请注意,如果任何文件名包含换行符、单引号或双引号或空格,这将无法正常工作。
find /tmp -name core -type f -print | xargs /bin/rm -f
2. 在目录 /tmp 中或下面查找名为 core 的文件并删除它们,以正确处理包含单引号或双引号、空格或换行符的文件或目录名称的方式处理文件名。 -name 测试出现在 -type 测试之前,以避免必须在每个文件上调用 stat。
find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
3. 对当前目录中或低于当前目录的每个文件运行“file”。请注意,大括号用单引号括起来,以防止它们被解释为 shell 脚本标点符号。 分号同样受到使用反斜杠的保护,尽管在这种情况下也可以使用单引号。
find . -type f -exec file '{}' \;
4. 只遍历文件系统一次,将 setuid 文件和目录列出到 /root/suid.txt 中,将大文件列出到 /root/big.txt 中。
find / \( -perm -4000 -fprintf /root/suid.txt '%#m %u %p\n' \) , \
\( -size +100M -fprintf /root/big.txt '%-10s %p\n' \)
5. 在你的主目录中搜索过去二十四小时内修改过的文件。此命令以这种方式工作,因为自上次修改每个文件以来的时间除以 24 小时,其余部分都将被丢弃。 这意味着要匹配 -mtime 0,文件必须在过去不到 24 小时之前进行过修改。
find $HOME -mtime 0
6. 搜索可执行但不可读的文件。
find /sbin /usr/sbin -executable \! -readable -print
7. 搜索对其所有者和组具有读写权限但其他用户可以读取但不能写入的文件。 满足这些条件但设置了其他权限位的文件(例如,如果有人可以执行该文件)将不会匹配。
find . -perm 664
8. 搜索对其所有者和组具有读写权限以及其他用户可以读取的文件,而不考虑是否存在任何额外的权限位(例如可执行位)。例如,这将匹配模式为 0777 的文件。
find . -perm -664
9. 搜索某人(他的所有者,或他的团体或其他人)可写的文件。
find . -perm /222
10. 所有三个命令都做同样的事情,但第一个使用文件模式的八进制表示,另一两个使用符号形式。 这些命令所有搜索其所有者或其组可写的文件。 所有者和组都不必匹配的文件; 要么会这样做。
find . -perm /220
find . -perm /u+w,g+w
find . -perm /u=w,g=w
11. 这两个命令都做同样的事情; 搜索其所有者及其组可写的文件。
find . -perm -220
find . -perm -g+w,u+w
12. 这两个命令都搜索了每个人(-perm -444或-perm -a + r)可读的文件,具有至少一个写入位设置(-perm /222或 -perm /a+w),但不是对于任何人(!-perm /111和!-perm /a+x)可执行的。
find . -perm -444 -perm /222 \! -perm /111
find . -perm -a+r -perm /a+w \! -perm /a+x
13. 此命令将 /source-dir 的内容复制到 /dest-dir,但省略名为.snapshot(以及它们中的任何内容)的文件和目录。它还省略名称以'〜'结束的文件或目录,但不是它们的内容。结构 -prune -o \(... -print0 \)非常常见。这里的想法是 -prune 前的表达式匹配要修剪的东西。但是,-prune 动作本身返回 true,因此后边的 -o 确保仅针对未被修剪的目录进行右侧的评估(修剪目录的内容甚至没有被访问过,因此它们的内容是无关紧要的)。仅为清楚起见,-o 右侧的表达式在括号中。它强调,-print0 操作仅对没有应用 -prune 的事物有效。因为默认在若干测试之间的 'and' 条件比 -o 更紧密地绑定,但括号有助于显示正在发生的事情。
cd /source-dir
find . -name .snapshot -prune -o \( \! -name '*~' -print0 \)|
cpio -pmd0 /dest-dir
14. 鉴于以下项目和其关联的SCM管理目录的以下目录,对项目的根执行有效搜索:
repo/project1/CVS
repo/gnu/project2/.svn repo/gnu/project3/.svn
repo/gnu/project3/src/.svn
repo/project4/.git
在此示例中, -prune 防止搜索已发现的目录(例如,我们未搜索Project3 / SRC,因为我们已经找到了Project3 / .svn),但确保了发现兄弟姐妹目录(Project2和Project3)。
find repo/ \( -exec test -d '{}'/.svn \; -or \
-exec test -d {}/.git \; -or -exec test -d {}/CVS \; \) \
-print -prune
15. 搜索目录/tmp中的这些类型的文件,目录和符号链接作为逗号分隔的列表(GNU扩展名)。
find /tmp -type f,d,l
另一种写法:find /tmp \( -type f -o -type d -o -type l \)