9

数百の.txtファイルの合計サイズを計算しようとしているディレクトリのセットがたくさんあります。私はこれを試しましたが、これはほとんど機能します:

find . -name *.txt | xargs du -hc

しかし、最後に合計1つを与える代わりに、いくつかを取得します。私の推測では、パイプは一度に非常に多くのfindの出力行のみを通過し、duは各バッチで動作します。これを回避する方法はありますか?

ありがとう!アレックス

4

7 に答える 7

12

--files0-from オプションを du に使用するのはどうですか? null で終わるファイル出力を適切に生成する必要があります。

find . -name "*txt" -exec echo -n -e {}"\0" \; | du -hc --files0-from=-

私のシステムでは正しく動作します。

于 2009-08-24T17:52:29.413 に答える
7
find . -print0 -iname '*.txt' | du --files0-from=-

いくつかの異なる拡張子を検索する場合は、次のようにするのが最善です。

find . -type f -print0 | grep -azZEi '\.(te?xt|rtf|docx?|wps)$' | du --files0-from=-
于 2010-10-21T19:57:01.190 に答える
6

xargsプログラムは、UNIXコマンドラインの最大長による制限を考慮して、物事をバッチに分割します。サブコマンドを一度に1つずつ実行するよりも効率的ですが、入力のリストが長い場合は、コマンドを十分な回数実行するため、各「実行」が問題を引き起こさないほど短くなります。

このため、xargsを実行する必要がある「バッチ」ごとに1つの出力行が表示される可能性があります。

あなたはそれが役に立つ/面白いと思うかもしれないので、manページはここでオンラインで見つけることができます:http://unixhelp.ed.ac.uk/CGI/man-cgi ?xargs


注意すべきもう1つのこと(これはあなたの投稿のタイプミスまたは私の誤解かもしれません)は、「*。txt」がエスケープされていない/引用されていないことです。つまり、あなたは

find . -name *.txt | xargs du -hc

あなたがおそらく望む場所

find . -name \*.txt | xargs du -hc

違いは、コマンドラインが*をfindに渡すのではなく、一致するファイル名のリストに*を展開している可能性があることです。これにより、*がパターンとして使用されます。

于 2009-08-24T17:31:27.227 に答える
3

別の簡単な解決策:

find . -name *.txt -print0 | xargs -0 du -hc
于 2012-08-23T16:00:54.530 に答える
1

別の解決策の 1 つは、bashforループを使用することです。

for i in `find . -name '*.txt'`; do du -hc $i | grep -v 'total'; done

これは、ループ内で何が起こるかをより詳細に制御する必要がある場合に適しています。

于 2015-03-30T10:45:00.470 に答える
0

別の解決策の1つは、awkを使用することです。

find . -name "*.txt" -exec ls -lt {} \; | awk -F " " 'BEGIN { sum=0 } { sum+=$5 } END { print sum }'
于 2009-08-24T17:47:36.587 に答える
0

xargsは、入力を適切なサイズのチャンクにバストします。表示されているのは、それらの各チャンクの合計です。入力の処理を構成する方法については、manページでxargsを確認してください。

于 2009-08-24T17:31:21.750 に答える