ディレクトリツリー内の特定の拡張子のすべてのファイルのサイズ


16

ホームフォルダー内の.o拡張子を持つファイル(オブジェクトファイル)のサイズを知りたい。

私はすべてのオブジェクトファイルを見つけることができます

find . -name '*.o'

これらのファイルの合計サイズを計算するにはどうすればよいですか?

回答:


24

パイプ(|)を探しています。これらは、複数のコマンドを接続し、1つのコマンドの出力を別のコマンドの入力として渡す方法です。この場合、見つけたすべてのファイル名を入力として渡しますdu(サイズを計算します)。ただし、duファイル名を期待し、その結果findは単なるテキストのリストであるため(はい、テキストはファイル名で構成されていますが、それduがわかるのはテキストだけです)、xargsそれぞれを取得するようなものを使用する必要がありますテキスト行、それをファイル名として扱い、それをに渡しますdu。これをすべてまとめると、次のようになります。

find . -name "*.o" | xargs du -sch
  • 常にあなたが与えるパターンを引用する必要がありますfind(上でやったように"*.o")。そうしないと、シェルは*.o現在のディレクトリ内の一致するファイルの名前に展開します。この場合、一致するファイルがなかったために機能しました。

  • -schフラグduは次のドキュメントに記載されていman duます。

    -c, --total
          produce a grand total
    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    -s, --summarize
          display only a total for each argument
    

ただし、空白を含むファイル名の場合は失敗することに注意してください。これはほとんど確実にオブジェクトファイルの問題にはなりませんが、将来、スペースを扱う必要がある場合は、以下を使用してください。

find . -name "*.o" -print0 | xargs -0 du -sch

-print0なるがfindNULLで区切られた行を印刷し、-0作るにはxargs、入力として、このようなラインを取ります。

または、findサイズ自体を印刷してから合計することもできます。

find . -name "*.o" -printf '%s\n' | awk '{c+=$1}END{print c}'

これは、引数が多すぎてコマンドが個別のコマンドに分割されるコメントで@Sergが言及した問題も回避します。


使用している場合bash(おそらく使用している場合)、より簡単な方法があります。

shopt globstar 
du -sch **/*.o

このshopt globstarコマンドは、**すべてのファイルまたは複数のサブディレクトリを一致させます。有効にすると、**/*.o名前がで終わるすべてのファイル(およびディレクトリ)と一致するため、に.o直接渡すことができduます。

findアプローチとは異なり、これは隠しファイル(名前がで始まるファイル)とは一致しないことに注意してください.。これらにも一致させるには、次のようにします。

shopt -s dotglob globstar
du -sch **/*.o

最初の問題には少し問題があります。MAXARGSのようなものがあります。したがってdu、の複数の反復があり、複数のtotal行が生成されます。例:paste.ubuntu.com/23092752
Sergiy Kolodyazhnyy

@Serg true。それを回避する別のオプションを追加しました。
テルドン

8

-exec フラグを使用してduコマンドを実行します ;(各ファイルごとに意味)

find . -name "*.o" -exec du -b {} \; | awk '{total+=$1}END{print total}' 

サンプル出力:

$ find . -name "*.txt"  -exec du -b {} \; | awk '{total+=$1}END{print total,"bytes" }'                                     
find: ‘./.cache/gvfs-burn’: Permission denied
find: ‘./.cache/unity’: Permission denied
852690242 bytes

find再帰的-すべてのサブディレクトリをウォークスルーすることを意味します。*.o現在のディレクトリ内のすべてのファイルの合計を取得する場合は、単に

du -b -c *.o

0

perlの場合:

perl -le 'map { $sum += -s } @ARGV; print $sum' -- *.pdf

現在のディレクトリにあるすべての非表示のPDFファイルのサイズ。


1
わかりましたが、OPは.oファイルを探しており、サブディレクトリにある可能性があります。繰り返しごとに合計を出力しないよう}{print $sumするために、before を追加することもできます。最後のものだけが必要です。
テルドン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.