web-dev-qa-db-ja.com

du skipシンボリックリンク

私のシステムでの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などを試しました。常にシンボリックリンクが表示されます。それらを削除する方法はありますか?

8
kainaw

これはシンボリックリンクを解決する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 {} +
14
Patrick

シンボリックリンクをduスキップする:

duは、リンクを追跡しないほど賢くありません。デフォルトでは、findはシンボリックリンクをスキップします。したがって、finddu、および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
2
Eric Leschinski