web-dev-qa-db-ja.com

/ bin / cat:引数リストが長すぎる

フォルダーに119766個のファイルがあります。それらはCSVファイルです。全ファイルの総行数を知りたい。

次のコマンドを実行しようとしています:

cat * |wc -l

ただし、次のエラーが発生します。

-bash:/ bin/cat:引数リストが長すぎます

どうやってやるの?これを回避する方法はありますか?

追加したいことの1つは、行の総数が非常に大きくなることです。

4
Milon Corleone

個々のファイルの行数が必要な場合:

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
5
cas

さて、質問からその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」です)。

6
Dubu

ファイルが多すぎる場合は、情報をstdoutに送信したくないので、次のようにします。

IFS="\n"; for file in find ./ -type f; do wc -l "$file" >> ~/linecount.txt; done
0
DopeGhoti