流式传输目录内容而不是读取所有项目

流式传输目录内容而不是读取所有项目

是否有一个 unix 命令可以用来流式传输目录的项目/内容?使用 Node.js,我们可以将所有内容读入内存:

fs.readdir(dir, (err, items) => {});

但我正在寻找流项目,对于一个非常大的目录,比如说其中有超过 1000 万个文件夹/文件。

tail命令用于读取文件而不是文件夹TMK,那么是否有一些unix实用程序可以流式传输文件夹的内容?

答案1

在系统级别,该readdir(3)调用用于返回目录条目流,直到出现错误或该列表用完:

 The readdir() function returns a pointer to the next directory entry in
 the named directory stream dirp.  It returns NULL upon reaching the end
 of the directory or detecting an invalid seekdir() operation.

是否以及如何fs.readdir映射到上述内容将取决于该函数在 JavaScript 中的实现方式;可能有一种方法可以fs.readdir依次调用来获取各个目录条目,而不是一次将它们全部读入内存。

readdir(3)不是递归的;它不会检查子目录的内容;为此,fts(3)通常使用调用。更高级的语言可以使用fts(3),或者它们可以手动递归连续的opendirreaddir、 和closedir调用,以在循环期间找到每个新的子目录readdir(3)

对于大量文件,特定的高级语言实现可能效率低下;我相信 Go 语言具有并发文件系统递归实现,并且多年来已经对实现进行了各种修复。

答案2

在 Unix 中,您可以使用该find命令来流式传输文件和目录或两者。最基本的命令是这样的:

$ find . 

这将流式传输文件和目录列表,然后可以通过管道将其传递到另一个命令,|或者您可以使用find的内置功能通过 运行另一个命令-exec

$ find . -type f -exec grep <somestring> {} \;

或者

$ find . -type f | ....

如果您只想要单个目录的内容,您可以通过开关限制查找-depth

$ find . -type f -depth 1 | ....

相关内容