wcを使用して行数を再帰的に計算すると誤った結果が発生する

wcを使用して行数を再帰的に計算すると誤った結果が発生する

次の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)で終わります。これは、ファイル名のリストが長すぎてコマンドラインの長さ制限を超える可能性がある場合に便利です。この場合、wcviaを実行すると、xargsリストを複数の部分に分割し、リスト全体ではなくwc各サブリストの合計を印刷するため、お勧めできません。 ASCII NUL終了ファイル名のリストを生成する1つの方法は、述語をfind使用してGNUを使用することです-print0。もし文書「-」の場合、ASCII NUL 出口ファイル名を標準入力から読み込みます。

このオプションをサポートしていない場合は、wcすべての「すべて」行を抽出して合計する単純なスクリプトを使用して出力を送信できます。

... | awk '$2=="total"{t=t+$1} END{print t " total"}'

おすすめ記事