ファイルを見つけてサイズを合計するにはどうすればよいですか?


12

一連のファイル(ワイルドカード式に基づく)を見つけて、それらのディスク使用量を合計したいと思います。

このようなもの:

$ find . -name 'flibble*' -ctime +90 -exec du -sh {} \;

2.1G    ./flibble_116.log
2.1G    ./flibble_83.log
2.1G    ./flibble_211040_157.log
2.1G    ./flibble3747_51.log

この作品。しかし、それは私が探している結果を生み出しません。各ファイルで使用されているスペースfindが繰り返し表示されます。

必要なのは、du見つかったすべてのファイルの合計です。

回答:


12

解決

オプション-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結果ごとに1回実行されますfind。結果のパス名がの代わりに渡され{}ます。

    $ 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)、ヌルで区切られたファイル名が読み取られます。改行文字とは異なり、ヌル文字はファイル名に表示されない可能性があるため、出力は明確です。

du(1)およびのオプションの詳細についてはfind(1)、それぞれのマンページを参照してください。

$ man du
$ man find

2
コマンドライン引数の数の制限のためにファイルの数が重要(1K +)である場合、複数の合計になる可能性があります。
ychaouche

@ychaoucheを確認できました。30k以上のファイルのサイズを評価しようとしたときに問題が発生しました。
Adrien H

それが問題である場合、の一部の実装ではdu(1)、ファイルからのファイル名の読み取りもサポートしていますfind 1 2 3 -maxdepth 0 -print0 > filenames; du -shc --files0-from=filenames
Witiko

4

これを試して:

du -c `find . -name 'flibble*' -ctime +90` | tail -1

元のコマンドは、すべての引数を通過するまで、1つの引数を指定して実行します。この方法では、単純にすべての引数を一度に指定し、個別のサイズを切り捨てて、合計のみを残します。必要に応じて、パイプとテールを削除して、各ファイルのサイズを表示できます。


これは、スペースを含むパス名で正しい結果を生成しません。これを行う正しい方法は、の-exec du -c {} +オプションを使用することですfind。これは、パス名を変更せずにに渡しduます。
Witiko、2014

4

あなたはこれを試すことができます:

find . -name 'flibble*' -ctime +90 -exec du -ch {} + | grep total

2

私が持っているでしょうfind、それ自体がサイズをプリントアウトし、合計を計算するために別のツールを使用します。

find . -name 'flibble*' -ctime +90 -printf "%s\n" |
perl -lnE '$sum += $_} END {say $sum'

ファイル名も確認したい場合:

find . -name 'flibble*' -ctime +90 -printf "%s\t%p\n" |
perl -apE '$sum += $F[0]} END {say $sum'

1

ほとんどのシステムで総ギガバイトを取得するために機能するはずの1つのライナー:

echo "$(( ($(find . -name 'flibble*' -ctime +90 -type f -printf '%k+' )0)/1024/1024 )) GB"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.