我正在尝试查找我的主目录和所有子目录中不存在的文件。
find ~/ -name "bogus"
几秒钟后给了我这个信息,但KDE 的dolphin
文件管理器需要将近 3 分钟才能做到这一点。这与我之前使用GNOMEbeagle
的经验一致。
find
当图形搜索(比命令行参数使用起来更直观)落后时,如何能够非常快速地做到这一点?
我正在尝试查找我的主目录和所有子目录中不存在的文件。
find ~/ -name "bogus"
几秒钟后给了我这个信息,但KDE 的dolphin
文件管理器需要将近 3 分钟才能做到这一点。这与我之前使用GNOMEbeagle
的经验一致。
find
当图形搜索(比命令行参数使用起来更直观)落后时,如何能够非常快速地做到这一点?
具体来说,使用 Baloo 来查看 Dolphin,它似乎会在其搜索域中查找每个文件的元数据,即使您正在执行简单的文件名搜索。当我跟踪该过程时,我看到对每个文件甚至条目的
file.so
调用lstat
,getxattr
然后再次调用。这些系统调用检索与文件名存储在不同位置的文件的元数据(文件名存储在目录内容中,但元数据在inode中)。多次查询文件的元数据很便宜,因为数据将在磁盘缓存中,但查询元数据和不查询元数据之间可能存在显着差异。getxattr
..
find
聪明得多。它试图避免不必要的系统调用。它不会调用getxattr
,因为它不基于扩展属性进行搜索。当它遍历一个目录时,它可能需要调用lstat
不匹配的文件名,因为这可能是一个递归搜索的子目录(lstat
是返回文件元数据的系统调用,包括文件类型,例如常规/目录/符号链接/…)。但是find
有一个优化:它知道一个目录有多少个子目录,从它的链接计数lstat
,一旦它知道它遍历了所有子目录,它就会停止调用。特别是在叶目录(没有子目录的目录)中,find
只检查名称,而不检查元数据。此外,一些文件系统在目录条目中保留文件类型的副本,因此如果这是它需要的唯一信息,find
甚至不需要调用。lstat
如果您
find
使用需要检查元数据的选项运行,它将进行更多调用,但如果它不需要信息(例如,因为文件被先前的条件排除lstat
),它仍然不会对文件进行调用lstat
名称匹配)。我怀疑其他重新发明
find
轮子的 GUI 搜索工具同样不如经过数十年优化的命令行实用程序聪明。至少,如果您搜索“任何地方”,Dolphin 足够聪明地使用定位数据库(在 UI 中并不清楚结果可能已过时的限制)。