すべての項目を読み取るのではなく、ディレクトリの内容をストリーミングします。 [閉じる]

すべての項目を読み取るのではなく、ディレクトリの内容をストリーミングします。 [閉じる]

ディレクトリのエントリ/コンテンツをストリーミングするために使用できるunixコマンドはありますか? Node.jsを使用すると、すべてをメモリに読み込むことができます。

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

しかし、私は千万を超えるフォルダ/ファイルを含む非常に大きなディレクトリのストリーミングプロジェクトを探しています。

この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手動で繰り返すこともできます。closedirreaddir(3)

特定の高度な言語実装は、多数のファイルに対して非効率的である可能性があります。 Go言語には同時ファイルシステムの再帰的な実装があり、長年にわたって実装に対するさまざまな修正が行われてきました。

答え2

Unixでは、このfindコマンドを使用してファイル、ディレクトリ、またはその両方をストリーミングできます。最も基本的なコマンドは次のとおりです。

$ find . 

これにより、ファイルとディレクトリのリストをストリーミングして別のコマンドにパイプすることができます。または内蔵機能を|使用して。find-exec

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

または

$ find . -type f | ....

単一のディレクトリの内容だけが必要な場合は、スイッチを使用してルックアップを制限できます-depth

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

関連情報