
次のLinuxコマンドを使用して、フォルダ構造内のテキストファイルの行数を再帰的に計算します。
find . -name '*.txt' | xargs -d '\n' wc -l
これにより、見つかったすべてのファイルとその行番号が出力されます。
86 ./folder1/folder11/folder111/file1.txt
67 ./folder1/folder11/folder112/file2.txt
7665 ./folder1/folder11/folder113/file3.txt
..., etc.
1738958 total
合計24,000を超えるファイルがあります。各ファイルの行数が正確で、すべてのファイルが所有されます。ただし、行の総数が正しくありません。この構造化サブフォルダの場合でも、行の総数がはるかに多くなります。たとえば、
cd folder1/folder11
find . -name '*.txt' | xargs -d '\n' wc -l
最後に23Mライン提供:
22535346 total
すべての行の総数は1.7Mではなく100Mより大きくなければなりません。私がここで何を見逃しているのでしょうか?
答え1
GNUがある場合は、wc
以下を使用してください。
find . -name "*.txt" -print0 | wc -l --files0-from -
これこのオプションのマニュアルセクション現在実行中の操作が機能しない理由を説明します。
‘--files0-from=file’
コマンドラインで指定されたファイル処理を無効にし、代わりにfileで指定されたファイルを処理します。文書;各名前は0バイト(ASCII NUL)で終わります。これは、ファイル名のリストが長すぎてコマンドラインの長さ制限を超える可能性がある場合に便利です。この場合、
wc
viaを実行すると、xargs
リストを複数の部分に分割し、リスト全体ではなくwc
各サブリストの合計を印刷するため、お勧めできません。 ASCII NUL終了ファイル名のリストを生成する1つの方法は、述語をfind
使用してGNUを使用することです-print0
。もし文書「-」の場合、ASCII NUL 出口ファイル名を標準入力から読み込みます。
このオプションをサポートしていない場合は、wc
すべての「すべて」行を抽出して合計する単純なスクリプトを使用して出力を送信できます。
... | awk '$2=="total"{t=t+$1} END{print t " total"}'
答え2
ファイルが多すぎるために発生する問題は、デフォルトでwc -l
すべてのファイルを一度に呼び出すと、コマンドが大きすぎるxargs
ために機能しないことです。あなたが見る結果はxargs
wc -l
最後の配置。数千行ほど上にスクロールすると、最終的に前のバッチの結果が表示されます。
すべてのファイルの総行数のみを計算する場合は、cat
その行をすべて削除してそのデータを次に送信できますwc -l
。
find . -type f -name '*.txt' -exec cat {} + | wc -l
これは、cat
バッチで見つかったファイルに対して実行され、結果のデータストリームですwc -l
。