回答:
パイプ(|)を探しています。これらは、複数のコマンドを接続し、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
-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
du、の複数の反復があり、複数のtotal行が生成されます。例:paste.ubuntu.com/23092752