フォルダーに119766個のファイルがあります。それらはCSVファイルです。全ファイルの総行数を知りたい。
次のコマンドを実行しようとしています:
cat * |wc -l
ただし、次のエラーが発生します。
-bash:/ bin/cat:引数リストが長すぎます
どうやってやるの?これを回避する方法はありますか?
追加したいことの1つは、行の総数が非常に大きくなることです。
個々のファイルの行数が必要な場合:
find . -type f -exec wc -l {} + | awk '! /^[ 0-9]+[[:space:]]+total$/'
この数のファイルが処理されている行がいくつかあるため、合計行を除外しました。 find ... -exec ... +
は、できるだけ多くのファイル名を1つのコマンドラインに収めようとしますが、LOTは119766ファイル未満になります。..wc
の呼び出しごとに、おそらく数千(最大)だけです。その結果、独自の独立した「合計」ラインになります。
すべてのファイルの合計行数を組み合わせたい場合は、次の1つの方法があります。
find . -type f -exec wc -l {} + |
awk '/^[ 0-9]+[[:space:]]+total$/ {print $1}' |
xargs | sed -e 's/ /+/g' | bc
これは、合計行の行数のみを出力し、それをxargs
にパイプしてすべて1行にカウントし、次にsedしてスペースを+
記号に変換し、ロットをbc
にパイプして計算を行います。
出力例:
$ cd /usr/share/doc
$ find . -type f -exec wc -l {} + |
awk '/^[ 0-9]+[[:space:]]+total$/ {print $1}' |
xargs | sed -e 's/ /+/g' | bc
53358931
さて、質問からそのcat
に新しい家を与えるには、これは行う必要があります:
find . -type f -exec cat {} + | wc -l
ファイル名の最大許容数(+
)でcat
を繰り返し実行し、すべてをwc
にパイプします。サブディレクトリを走査しない場合は、-maxdepth 1
をディレクトリの後にfindコマンドに追加する必要があります。
別の方法として、GNU wc
の--files0-from
オプションを使用できます。
find . -type f -print0 | wc -l --files0-from=- | tail -1
このオプションを指定すると、wc
は内容ではなく、標準入力からfilenamesをnull文字で区切って読み取ります。 -print0
を使用すると、find
はこれらのファイル名をnullバイトで区切って出力します。 wc
は引き続きすべてのファイルの行数を出力するため、最後の要約行、つまりtail
以外のすべてをスキップすることをお勧めします。
どちらのソリューションも、どのロケールでも機能するという利点がありますが、@ casソリューションは適応する必要があります(たとえば、「合計」はドイツ語では「insgesamt」です)。
ファイルが多すぎる場合は、情報をstdoutに送信したくないので、次のようにします。
IFS="\n"; for file in find ./ -type f; do wc -l "$file" >> ~/linecount.txt; done