获取递归包含在目录中的文件列表的最快方法是啥?
Posted
技术标签:
【中文标题】获取递归包含在目录中的文件列表的最快方法是啥?【英文标题】:What is the fastest way to get the list of files recursively contained in a directory?获取递归包含在目录中的文件列表的最快方法是什么? 【发布时间】:2012-09-14 10:16:57 【问题描述】:我有一个目录,其中包含分布在文件夹层次结构中的数百万个文件。该目录存储在一个大型远程 NFS 文件系统上。我想尽快检索这些文件的列表。
有可能比find . > list.txt
更快吗?影响速度的因素有哪些?我正在使用 python,但只要它是 fast,任何解决方案都可以使用。
【问题讨论】:
除非你存储了一个包含所有文件列表的文件,否则在线检索数百万个文件的列表需要时间...... :) @Saphrosit :我知道这需要时间并且我期待它,但我想知道是否有一种方法可以“一次向文件系统询问数据”,而不是轮询每个目录和文件。 ls -r 可能是你能得到的最快的。没有办法一次向文件系统询问所有数据。数据是远程的这一事实使事情变得更糟。本地实现会更快(例如,如果您可以 ssh 进入服务器并因此在本地创建列表)。 注意:在低级别fts
和 ftw
(谷歌或使用 man
)是最快的例程。但是一个体面的ls
实现应该要么使用它们,要么使用与它们使用的代码极其相似的代码。在更低的级别(真正的构建块)上,您会得到类似opendir
(如果文件系统支持dirent
中的d_type
字段,则足以提供文件名列表)和(l)stat
。
我不是 NFS 专家。但我猜 NSF 实际上是一个文件系统。低级协议是否支持构建块之上的任何内容?不知道。我必须谷歌它或查看实现源/文档(我想你可以自己做)。请注意,ls
和 find
只能在标准文件系统 API 级别上工作。甚至fts
和ftw
都是通过调用opendir
、(l)stat
和do-not-remember-the-name 来更改当前目录实现的,所以我会惊讶地发现NFS 给了你更多的。如果您发现它确实会发布您的发现。
【参考方案1】:
在 linux 上,这对我来说是最快的。像这样使用 (bash) globbing 和 printf:
printf "%s\n" directory/**/file
printf "%s\x00" directory/**/filename-with-special-characters | xargs -0 command
似乎比
快很多find directory -name file
或
ls -1R directory | grep file
甚至,令人惊讶的是,
ls directory/**/file
这是一个本地文件系统:x86_64 系统,SSD 上的 ext4 文件系统,在一个包含超过 600,000 个目录的目录结构中,其中包含多个文件。
【讨论】:
你能添加一些数字,给出一个大概的想法吗? 如果文件数不超过 bash 命令行限制,将起作用。【参考方案2】:取决于你想要的输出。我建议使用
ls -R | grep ":$" | sed -e 's/:$//' -e 's/^/ /' -e 's/-/|/'
获取当前目录中递归所有文件的完整路径。
【讨论】:
我不理解 sed 部分,但这不只显示目录吗? 是的,它将输出限制为仅您想要的数据。尝试在没有 sed 部分的情况下运行它以查看差异: ls -R | grep ":$"以上是关于获取递归包含在目录中的文件列表的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章