私のシステムでのdu
のデフォルトの動作は、適切なデフォルトの動作ではありません。
ls
my /data
フォルダーを確認すると、次のように表示されます(重要ではないものを削除します)。
ghs
ghsb -> ghs
hope
rssf -> roper
roper
各フォルダ内には、名前として番号が付いたフォルダのセットがあります。 14
という名前のすべてのフォルダの合計サイズを取得したいので、以下を使用します。
du -s /data/*/14
そして、私は...
161176 /data/ghs/14
161176 /data/ghsb/14
8 /data/hope/14
681564 /data/rssf/14
681564 /data/roper/14
私が欲しいのは:
161176 /data/ghs/14
8 /data/hope/14
681564 /data/roper/14
シンボリックリンクを見たくありません。 -L
、-D
、-S
などを試しました。常にシンボリックリンクが表示されます。それらを削除する方法はありますか?
これはシンボリックリンクを解決するdu
ではありません。それはあなたのシェルです。
*
はシェルグロブです。コマンドを実行する前にシェルによって展開されます。したがって、実際には、実行しているコマンドは次のとおりです。
du -s /data/ghs/14 /data/ghsb/14 /data/hope/14 /data/rssf/14 /data/roper/14
シェルがbashの場合、シンボリックリンクを展開しないように指示する方法がありません。ただし、代わりにfind
(GNUバージョン)を使用できます。
find /data -mindepth 2 -maxdepth 2 -type d -name 14 -exec du -s {} +
du
スキップする:du
は、リンクを追跡しないほど賢くありません。デフォルトでは、find
はシンボリックリンクをスキップします。したがって、find
、du
、およびawk
の間に不誠実な同盟関係を構築すると、適切なダークマジックの呪文は次のようになります。
find /home/somedirectory/ -exec du -s {} + | awk '{total = total + $1}END{print total}'
生成:
145070492
出力を人間が読めるようにするには:
find /home/somedirectory/ -exec du -s {} + | awk '{total = total + $1}END{print (total / 1024 / 1024) "MB"}'
生成:
138.35MB
何が起きてる:
/home/somedirectory/ directory to search.
-exec du -s + run du -s over the results, producing bytes
awk '...' get the first token of every line and add them up,
dividing by 1024 twice to produce MB