duコマンドでディレクトリを指定した場合にのみ、パラメータリストが長すぎます。エラーが発生します。

duコマンドでディレクトリを指定した場合にのみ、パラメータリストが長すぎます。エラーが発生します。

/mydirectory/data/ディレクトリ内の特定のファイルの合計サイズを計算しようとしているので、この特定のディレクトリのcd後に次のコマンドを使用します。

du -c *.bin | grep total | awk '{print$1+0}'

コマンドは期待どおりに機能します。しかし、私が試したとき:

du -c /mydirectory/data/*.bin | grep total | awk '{print$1+0}'

エラーメッセージが表示されます

bash: /usr/bin/du: Argument list too long

これは同じディレクトリですが、最初のケースでは機能しますが、2番目のケースでは機能しないのはなぜですか? 2番目のケースに追加の拡張はありますか?これは、同じ数のファイルを含む同じディレクトリです。

問題は、このコマンドを大きなスクリプトに入れる必要があるため、bash毎回ディレクトリに入ってから戻ることは便利ではないということです。cd

答え1

拡張引数のリストが長すぎると発生します。つまり、引数として指定されたすべてのファイル名で構成される文字列の長さ(すべての環境変数とその値の長さとの組み合わせ)が、特定の値「パラメータのリストが余りに制限」を超えると発生します。エラー。バイト数。

運が良ければ、最初のコマンドでこのエラーは発生しません。

2番目のコマンドが原因でこのエラーが発生します。だから今すべての主張また、文字列も含みます/mydirectory/data/。これは、引数リストが少なくとも18バイト増加することを意味します。各パラメータまたは1000ファイルあたり18kBです。

まず、次の手順を実行してこの問題を解決できますcd /mydirectory/data

( cd /mydirectory/data/ && du -c *.bin ... )

(括弧は、コマンドの現在のディレクトリのみが変更されるため、「戻る」cd必要がないことを示します。)cd

現在は機能しますが、一致するファイルを追加しても機能しません*.bin。この場合、少し複雑なアプローチを使用する必要があるかもしれません。

find /mydirectory/data -maxdepth 1 -type f -name '*.bin' -exec du -c {} + |
awk '/total/ { sum += $1 } END { print sum }'

これはduできるだけ多くのファイルで実行されます。できるだけあなたのディレクトリから一括で。プログラムgrepにマージされ(出力をawk提供する理由はありませんでした)、プログラムは単純な合計を実行し、最後にそれを出力します。awkgrepawk

コマンドが複数回実行され、複数行が生成されるため、awk合計を計算するプログラムが必要です。dutotal

答え2

find /mydirectory/data -iname "*.bin" -maxdepth  1 |xargs du -c |
awk '{print $1 }'|xargs |tr " " "+" |bc

関連情報