数百の.txtファイルの合計サイズを計算しようとしているディレクトリのセットがたくさんあります。私はこれを試しましたが、これはほとんど機能します:
find . -name *.txt | xargs du -hc
しかし、最後に合計1つを与える代わりに、いくつかを取得します。私の推測では、パイプは一度に非常に多くのfindの出力行のみを通過し、duは各バッチで動作します。これを回避する方法はありますか?
ありがとう!アレックス
--files0-from オプションを du に使用するのはどうですか? null で終わるファイル出力を適切に生成する必要があります。
find . -name "*txt" -exec echo -n -e {}"\0" \; | du -hc --files0-from=-
私のシステムでは正しく動作します。
find . -print0 -iname '*.txt' | du --files0-from=-
いくつかの異なる拡張子を検索する場合は、次のようにするのが最善です。
find . -type f -print0 | grep -azZEi '\.(te?xt|rtf|docx?|wps)$' | du --files0-from=-
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に渡すのではなく、一致するファイル名のリストに*を展開している可能性があることです。これにより、*がパターンとして使用されます。
別の簡単な解決策:
find . -name *.txt -print0 | xargs -0 du -hc
別の解決策の 1 つは、bashfor
ループを使用することです。
for i in `find . -name '*.txt'`; do du -hc $i | grep -v 'total'; done
これは、ループ内で何が起こるかをより詳細に制御する必要がある場合に適しています。
別の解決策の1つは、awkを使用することです。
find . -name "*.txt" -exec ls -lt {} \; | awk -F " " 'BEGIN { sum=0 } { sum+=$5 } END { print sum }'
xargsは、入力を適切なサイズのチャンクにバストします。表示されているのは、それらの各チャンクの合計です。入力の処理を構成する方法については、manページでxargsを確認してください。