我在包含大约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%的文件)。是什么导致了时间的增加?
答案 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
以确定它们是否是文件(不是目录,符号链接等)。