是什么导致在find中执行-type f的时间增加

时间:2013-01-30 00:53:06

标签: linux bash unix find

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

$ 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

为什么使用-type f比正常的find命令花费的时间长得多?我认为它会更快,因为它不必遍历所有文件(可能减少20%的文件)。是什么导致了时间的增加?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

进一步背景:

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

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

答案 1 :(得分:1)

它必须遍历目录并对它们执行stat以确定它们是否是文件(不是目录,符号链接等)。

PS:我对价值“$ FULFILLMENT”“$ ARCH1”“$ ARCH2”“$ MASTERING”做了一些假设