解決策
オプション -c
を指定する (または --total
) から du(1)
、総計を生成するように指示できます。 du(1)
の実装の場合 これらのオプションのいずれかをサポートしている場合、次のコマンドを使用して目的の効果を得ることができます:
$ find . -name 'flibble*' -ctime +90 -exec du -shc {} +
編集: ファイルの数がシステムで許可されているパラメータの最大数を超える場合は、find
になることに注意してください。 まだ command
を実行する可能性があります 複数回。 du(1)
のいくつかの実装 また、ファイルからのファイル名の読み取りもサポートしています。これは、前述の制限の影響を受けません:
$ find -name 'flibble*' -ctime +90 -print0 > filenames
$ du -shc --files0-from=filenames
説明
-exec command {} \;
のセマンティクスの違い と -exec command {} +
は次のとおりです:
-
command {} \;
command
を実行しますfind
の結果ごとに 1 回 .{}
の代わりに結果のパス名が渡されます .$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} \; 1 2 3
-
command {} +
command
を実行します 、すべての結果が取得されたとき。{}
の代わりに結果のパス名が渡されます .$ touch 1 2 3 $ find 1 2 3 -maxdepth 0 -exec echo {} + 1 2 3
-print0
オプションは find(1)
を引き起こします 見つかったファイル名をヌル文字で区切って標準出力に出力し、--files0-from
オプションは du(1)
を引き起こしました null で区切られたファイル名を読み取ります。改行文字とは異なり、ヌル文字はファイル名に表示されない可能性があるため、出力は明確です。
du(1)
のオプションについて詳しく知るには と find(1)
、それぞれのマンページを参照してください:
$ man du
$ man find
これを試してください:
du -c `find . -name 'flibble*' -ctime +90` | tail -1
元のコマンドは du に 1 つの引数を与えてから、すべての引数を通過するまでそれを実行します。このように、すべての引数を一度に与えてから、個別のサイズを切り捨て、合計のみを残すだけです。必要に応じて、パイプとテールを削除して、各ファイルのサイズを表示できます。
これを試すことができます:
find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total