Skip Symbolic Links with DU Command – How to Guide

shellsymlinkwildcards

The default behavior of du on my system is not the proper default behavior.

If I ls my /data folder, I see (removing the stuff that isn't important):

ghs
ghsb -> ghs
hope
rssf -> roper
roper

Inside each folder is a set of folders with numbers as names. I want to get the total size of all folders named 14, so I use:

du -s /data/*/14

And I see…

161176 /data/ghs/14
161176 /data/ghsb/14
8 /data/hope/14
681564 /data/rssf/14
681564 /data/roper/14

What I want is only:

161176 /data/ghs/14
8 /data/hope/14
681564 /data/roper/14

I do not want to see the symbolic links. I've tried -L, -D, -S, etc. I always get the symbolic links. Is there a way to remove them?

Best Answer

This isn't du resolving the symbolic links; it's your shell.

* is a shell glob; it is expanded by the shell before running any command. Thus in effect, the command you're running is:

du -s /data/ghs/14 /data/ghsb/14 /data/hope/14 /data/rssf/14 /data/roper/14

If your shell is bash, you don't have a way to tell it not to expand symlinks. However you can use find (GNU version) instead:

find /data -mindepth 2 -maxdepth 2 -type d -name 14 -exec du -s {} +
Related Question