手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

find(1)

名称

find - 查找文件

用法概要

/usr/bin/find [-H | -L] path... expression
/usr/xpg4/bin/find [-H | -L] path... expression

描述

find 实用程序将以递归方式向下搜索目录分层结构的每个 path,查找与使用下面指定的主要元素编写的布尔型 expression 相匹配的文件。

find 能够向下搜索任意深度的文件分层结构而不会由于路径长度限制而失败,除非应用程序指定的 path 操作数超出 PATH_MAX 要求。

find 可检测死循环,也即,进入了一个先前访问过的目录,该目录是所遇到的上一文件的祖先。

选项

支持以下选项:

–H

使得针对命令行中出现的每个符号链接所计算出的文件信息和文件类型归属于链接所引用的文件,而不是链接本身。如果引用的文件不存在,则文件信息和类型用于链接本身。未含在命令行中的所有符号链接的文件信息均属于链接本身。

–L

使得针对每个符号链接所计算出的文件信息和文件类型归属于链接所引用的文件,而不是链接本身。请参见“附注”部分。

指定多个 –H–L 互斥选项不会被视为错误。指定的最后一个选项将决定实用程序的行为。

操作数

支持下列操作数:

path

目录分层结构中起点的路径名。

expression

开头的或者为 !( 的第一个参数与所有后续参数均被解释为 expression,由以下主要元素和操作数组成。具体来讲,只要 n 用作主参数,就会被解释为十进制整数,可以选择在其前面添加加号 (+) 或减号 (),如下所示:

+n

大于 n

n

正好等于 n

-n

小于 n

表达式

有效表达式包括:

–acl

如果文件定义了其他 ACL,则为 True。

–amin n

文件的上次访问是在 n 分钟之前。

–atime n

如果于 n 天之前访问了文件,则为 True。对 path 中目录的访问时间由 find 自身进行更改。

–cmin n

文件状态的上次更改是在 n 分钟之前。

–cpio device

始终为 True。以 cpio 格式(记录大小为 5120 字节)在 device 上编写当前文件。

–ctime n

如果已于 n 天之前更改了文件状态,则为 True。

–depth

始终为 True。可对目录分层结构执行向下搜索,以便在处理目录本身之前先处理其中的所有条目。在将 findcpio(1) 结合使用以传输无写入权限的目录中包含的文件时,这会很有用。

–exec command

如果执行的命令返回零值作为退出状态,则为 True。命令的结尾必须添加转义的分号 (;)。命令参数 {} 将替换为当前路径名。如果 –exec 的最后一个参数为 {} 且指定的是 + 而不是分号 (;),则调用该命令的次数会较少,且 {} 会替换为路径名组。如果对该命令的任何调用返回了非零值作为退出状态,则 find 也会返回非零值的退出状态。

–follow

不管出现在 expression 的何处,都将始终为 True 且始终进行计算。如果在调用带 –H–L 选项的 find 命令时使用 –follow,则行为是不明确的。这可导致跟随符号链接。在跟随符号链接时,find 将跟踪记录访问过的目录,以便检测死循环。例如,如果符号链接指向祖先,则会发生此类死循环。该表达式不应与查找类型 l 表达式一起使用。请参见“附注”部分。

–fstype type

如果文件所属的文件系统类型为 type,则为 True。

–group gname

如果文件属于名为 gname 的组,则为 True。如果 gname 是个数字且未出现在 group(4) 数据库中,则其被认为是组 ID。

–iname pattern

–name 类似,但模式与当前文件名的基名之间进行匹配时不区分大小写。(请参见“示例”部分)。与 –name 选项不同的是,对于 /usr/bin/find/usr/xpg4/bin/find,对前导句点没有特殊处理且通配符文件名生成字符可以与以 . 开头的文件名进行匹配。

–inum n

如果文件具有 inode 编号 n,则为 True。

–links n

如果文件具有 n 个链接,则为 True。

–local

如果文件系统类型不是 /etc/dfs/fstypes 文件中定义的一个远程文件系统类型,则为 True。如果 /etc/dfs/fstypes 文件不存在,则 nfs 会用作缺省远程文件系统类型。–local 选项可向下搜索非本地目录的分层结构。有关如何以非向下方式搜索本地文件的示例,请参见“示例”部分。

–ls

始终为 True。显示当前路径名及其关联的统计信息。这些信息包括(分别):

  • inode 编号

  • 以千字节(1024 字节)为单位的大小

  • 保护模式

  • 硬链接数

  • 用户

  • 大小,以字节为单位

  • 修改时间。

如果文件是一个特殊文件,则大小字段将改为包含主设备号和从设备号。

如果文件是一个符号链接,则显示所链接文件的路径名,路径名前面加上 `'。格式与 ls –gilds 的格式相同(请参见 ls(1B))。

格式设置操作将在内部完成,无需执行 ls 程序。

–mmin n

文件数据的上次修改是在 n 分钟之前。

–mount

始终为 True。将搜索范围限定于包含指定目录的文件系统。不会列出其他文件系统的挂载点。

–mtime n

如果已于 n 天之前修改了文件数据,则为 True。

–name pattern

如果 pattern 匹配当前文件名的基名,则为 True。可使用普通的 shell 文件名生成字符(请参见 sh(1))。在模式中使用反斜杠 ( \ ) 作为转义符。从 shell 调用 find 时,应对模式进行转义或加上引号。

在使用 /usr/bin/find 时,除非在 pattern 的开头显式指定了字符 '.',否则以 '.' 开头的当前文件名不会与 pattern 进行匹配。/usr/xpg4/bin/find 不会对此进行区分;通配符文件名字符可以与以 '.' 开头的文件名进行匹配。

–ncpio device

始终为 True。以 cpio –c 格式(记录大小为 5120 字节)在 device 上编写当前文件。

–newer file

如果当前文件的最近修改时间晚于参数 file 的时间,则为 True。

–nogroup

如果文件所属的组不位于 group(4) 数据库中,则为 True。

–nouser

如果文件所属的用户不位于 passwd(4) 数据库中,则为 True。

–ok command

–exec 类似,区别在于生成的命令行在开头显示有问号且仅在得到肯定性响应时才执行。

–perm []mode

mode 参数用于表示文件模式位。在格式上,它与 chmod(1) 中所述的符号模式操作数 symbolic_mode_list 相同,且如下进行解释。开始时,假设模板中的所有文件模式位已清除。op 符号为:

+

在模板中设置相应的模式位

清除相应位

=

设置相应的模式位,且不考虑进程的文件模式创建掩码的内容

op 符号 不能为 mode 的第一个字符,以避免可能将其误认为前导连字符。因为初始模式是禁用所有位,所以不存在需要使用 作为第一个字符的符号模式。

如果忽略连字符,则在文件权限位完全匹配所生成的模板的值时,主表达式将计算为 True。

否则,如果 mode 的前缀为连字符,则至少在文件权限位中设置所生成的模板的所有位时,主表达式才会计算为 True。

–perm []onum

如果文件权限标志完全匹配八进制数字 onum,则为 True(请参见 chmod(1))。如果 onum 的前缀为减号 (),则仅将 onum 中设置的位与文件权限标志进行比较,如果匹配,则表达式会计算为 True。

–print

始终为 True。可显示当前路径名。

–print0

始终为 True。使显示的当前路径名后跟空字符,而不是 –print 使用的换行符。

通过此表达式,处理 find 输出的程序可正确解释包含换行符或其他类型的空格的文件名。此选项对应于 cpioxargs–0 选项。

–prune

始终为 True。只要 pattern 匹配,就不会检查目录结构中的任何目录或文件。(请参见“示例”部分)。如果指定 –depth,则 –prune 不再有效。

–size n[c]

如果文件的长度为 n 个块(每个块 512 个字节),则为 True。如果 n 后面跟 c,则大小以字节为单位。

–type c

如果文件的类型为 c,则为 True,其中 cbcdDflps,分别代表块特殊文件、字符特殊文件、目录、门文件、纯文本文件、符号链接、fifo(命名管道)或套接字。

–user uname

如果文件属于用户 uname,则为 True。如果 uname 是数字且未作为登录名出现在 passwd(4) 数据库中,则认为其是用户 ID。

–xdev

–mount 主参数相同。

–xattr

如果文件具有扩展属性,则为 True。

复杂表达式

使用以下操作数可以组合主表达式(按优先级递减顺序):

1)(expression)

如果带有括号的表达式为 True(括号对 shell 有特殊含义,必须进行转义),则为 True。

2)!expression

主表达式的否定(! 是一元 not 运算符)。

3) expression[–a] expression

主表达式的串联(通过两个并列的主表达式来暗示 and 运算)。

4) expression–oexpression

主表达式的备选项(–oor 运算符)。

在将 findcpio 结合使用时,如果将 –L 选项与 cpio 一起使用,则必须将 –L 选项或 –follow 基元与 find 一起使用,反之亦然。否则,会产生意外的结果。

如果不存在 expression,则会将 –print 用作表达式。否则,如果指定的表达式不包含任何 –exec–ok–ls–print 主表达式,则指定的表达式事实上会由以下项代替:

(specified) –print

–user–group–newer 主表达式每个仅计算一次其各自的参数。调用 –exec–ok 指定的 command 不会影响同一文件中的后续主表达式。

用法

有关 find 遇到大于或等于 2 GB(231 字节)文件时行为的说明,请参见 largefile(5)

示例

示例 1 写出分层结构目录

以下命令是等效的:

example% find .


example% find . -print

它们均会写出当前目录的整个目录分层结构。

示例 2 删除文件

以下命令可删除起始目录中一周内未访问的名为 a.out*.o 的所有文件。

example% find $HOME \( -name a.out -o -name '*.o' \) \
       -atime +7 -exec rm {} \; 
示例 3 显示所有文件名但跳过 SCCS 目录

以下命令以递归方式显示当前目录及其下目录中的所有文件名,但会跳过 SCCS 目录:

example% find . -name SCCS -prune -o -print
示例 4 显示所有文件名和 SCCS 目录名

以递归方式显示当前目录及其下目录中的所有文件名,将跳过 SCCS 目录的内容,但会显示 SCCS 目录名:

example% find . -print -name SCCS -prune
示例 5 测试较新文件

以下命令基本上与 test(1)–nt 扩展等效:

example$ if [ -n "$(find
file1 -prune -newer file2)" ]; then

printf %s\\n "file1 is newer than file2"
示例 6 使用 24 小时模式选择文件

–atime–ctime–mtime 的说明使用了术语 n,即“24 小时期间”。例如,可通过以下命令选择于 23:59 访问过的文件:

example% find . -atime -1 -print

执行命令的时间是下一日的 00:01(下一日为该时刻之后不超过 24 小时,之前不超过一天)。两天之间的午夜边界不会影响 24 小时计算。

示例 7 显示与用户的权限模式匹配的文件

以下命令以递归方式显示其权限模式与用户的读写和执行访问权限、组以及其他人员的读和执行访问权限完全匹配的所有文件名:

example% find . -perm u=rwx,g=rx,o=rx

以上命令还可以按如下方式指定:

example% find . -perm a=rwx,g-w,o-w
示例 8 显示其他人员具有写访问权限的文件

以下命令以递归方式显示其权限包括但不仅限于其他人员的写访问权限的所有文件名:

example% find . -perm -o+w
示例 9 显示本地文件,不向下搜索非本地目录
example% find . ! -local -prune -o -print
示例 10 显示具有扩展属性的名称空间中的文件
example% find . -xattr
示例 11 显示所有 PDF 文件名(不考虑大小写)

以下示例可查找扩展名为 .pdf.PDF.Pdf 等的所有文件名。

example% find . -iname '*.pdf'

环境变量

有关影响 find 执行的以下环境变量的描述,请参见 environ(5):LANG、LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES 和 NLSPATH。

PATH

确定 –exec–ok 主表达式的 utility_name 位置。

肯定的回答使用为用户语言环境中 LC_MESSAGES 类别的 yesexpr 关键字定义的扩展正则表达式进行处理。LC_COLLATE 类别中指定的语言环境定义为 yesexpr 定义的表达式中使用的范围、等效类和多字符整理元素的行为。LC_CTYPE 中指定的语言环境确定文本数据字符字节序列解释的语言环境,以及为 yesexpr 定义的表达式中使用的字符类的行为。请参见 locale(5)

退出状态

将返回以下退出值:

0

已成功遍历所有 path 操作数。

>0

出现错误。

文件

/etc/passwd

口令文件

/etc/group

组文件

/etc/dfs/fstypes

用于注册分布式文件系统软件包的文件

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/core-os
CSI
Enabled(已启用)
接口稳定性
Committed(已确定)
标准
请参见 standards(5)

另请参见

chmod(1)cpio(1)sh(1)test(1)ls(1B)acl(2)stat(2)umask(2)group(4)passwd(4)attributes(5)environ(5)fsattr(5)largefile(5)locale(5)standards(5)

警告

以下选项已过时,在将来的发行版中将不受支持:

–cpio device

始终为 True。以 cpio 格式(记录大小为 5120 字节)在 device 上编写当前文件。

–ncpio device

始终为 True。以 cpio –c 格式(记录大小为 5120 字节)在 device 设备上编写当前文件。

附注

使用 find 确定某时间范围内修改的文件时,请在 –print 参数前面使用 –mtime 参数。否则,find 会列出所有文件。

位于 Solaris 根文件系统下的某些文件实际上是虚拟文件系统(例如 mntfsnamefs)的挂载点。在与 ufs 文件系统进行比较时,如果在 find 表达式中指定了 –mount–xdev,则不会选择此类文件。

在向下搜索受其他用户控制的文件系统分层结构时,不建议使用 –L–follow 选项。尤其是在使用 –exec 时,符号链接可能会导致 find 命令脱离其启动时所在的分层结构。使用 –type 不足以限定运行 –exec 命令的文件类型,因为在 find 命令执行的类型检查与已执行的命令针对文件参数运行的时间之间,存在固有竞争情况。