获取递归包含在目录中的文件列表的最快方法是啥?

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 进入服务器并因此在本地创建列表)。 注意:在低级别 ftsftw(谷歌或使用 man)是最快的例程。但是一个体面的ls 实现应该要么使用它们,要么使用与它们使用的代码极其相似的代码。在更低的级别(真正的构建块)上,您会得到类似opendir(如果文件系统支持dirent 中的d_type 字段,则足以提供文件名列表)和(l)stat 我不是 NFS 专家。但我猜 NSF 实际上是一个文件系统。低级协议是否支持构建块之上的任何内容?不知道。我必须谷歌它或查看实现源/文档(我想你可以自己做)。请注意,lsfind 只能在标准文件系统 API 级别上工作。甚至ftsftw 都是通过调用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 ":$"

以上是关于获取递归包含在目录中的文件列表的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

递归搜索目录中的文件

获取计算列表中前 n 个项目的最快方法是啥?

异步和递归目录扫描,用于 Nodejs 和 Expressjs 中的文件列表

获取运行命令时修改的文件列表的有效方法是啥?

在 Ruby 中递归列出目录的单线器?

访问 zip 文件中文件的最快方法是啥?