duはシンボリックリンクをスキップします。

duはシンボリックリンクをスキップします。

私のシステムのデフォルト動作はdu正しいデフォルト動作ではありません。

lsフォルダを表示すると、次/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。私はいつもシンボリックリンクを取得します。削除する方法はありますか?

答え1

これは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 {} +

答え2

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

答え3

このフラグを使用してください-L

マニュアルページから:

-L, --dereference
              dereference all symbolic links

次にduは、シンボルの有無にかかわらずサイズを計算します。

答え4

du -P

-P、--no-dereferenceはシンボリックリンクに従わない(デフォルト)

関連情報