1

我在包含大约 1M 文件的卷组合上完成了以下命令。

$ sudo find "$FULFILLMENT" "$ARCH1" "$ARCH2" "$MASTERING"
Tue Jan 29 15:04:05 PST 2013
Tue Jan 29 15:22:46 PST 2013
18m41s


$ sudo find "$FULFILLMENT" "$ARCH1" "$ARCH2" "$MASTERING" -type f
Tue Jan 29 15:24:06 PST 2013
Tue Jan 29 15:49:10 PST 2013
25m4s

为什么 using-type f比普通的 find 命令花费这么多时间?我认为它会更快,因为它不必遍历所有文件(可能减少 20% 的文件)。时间增加的原因是什么?

4

2 回答 2

4

没有该-type f参数,find将不会stat每个文件,而是使用readdir系统调用来获取目录条目,减少系统调用、上下文切换、inode 查找等次数。

在这种特定情况下,find可以使用查询优化器。-O2在手册页中查找find. 您的查询将变为:

$ sudo find -O2 "$FULFILLMENT" "$ARCH1" "$ARCH2" "$MASTERING" -type f

这应该与不带 的查找具有相同的性能,-type f因为它将尝试使用readdir系统调用返回的文件类型信息(如果可用),而不是要求对每个文件单独stat调用。

进一步背景:

并非所有文件系统都支持type在调用中返回文件信息readdir,并且并非所有版本的find编译都会支持此扩展类型信息。

如果find --version报告该D_TYPE功能,则您的查找支持阅读此附加类型信息。文件系统类型 ext2、ext3、ext4 支持该D_TYPE字段。

于 2013-01-30T01:32:47.387 回答
1

它必须遍历目录并对stat它们进行操作以找出它们是否是文件(不是目录、符号链接等)。

PS:我正在对值“$FULFILLMENT”“$ARCH1”“$ARCH2”“$MASTERING”做出一些假设

于 2013-01-30T00:57:40.103 回答