1

Let me begin with an example:

  1. "/" or Root Filesystem is of Size 10GB and is currently 100% in Use.
  2. "/usr" is a directory under "/".
  3. "/usr/something" is a separate logical volume or mount point and looking fine.
  4. "/var" is a separate LV and looking fine too.

When we check what directory / file is consuming the disk space on the root volume, we use "du" command as shown below:

du -sh /*

However, this includes the other partitions/volumes too.

du -x -sh /*

That too, does the same thing. It does not exclude other disk volumes. However, the man page says:

-x, --one-file-system skip directories on different file systems

If we see "/usr" consuming most of the disk space on the root filesystem and it is a directory under "/" then running "du -x -sh /usr/*" against it would also report on "/usr/something" which is a separate disk and is large in size causing the command to exit with much delay.

Bottom Line: How to show only "one filesystem" when running "du" command or any other command to identify disk usage and culprit files excluding any other disk volume under that directory / filesystem?

Thanks!

3
  • Is there a reason you can't use --exclude=[PATTERN]? Apr 21 at 3:02
  • I noticed that option, but we have multiple of such subdirectories that are logical volumes mount on. I gave a simple example in the question. Apr 21 at 3:40
  • Besides, "--exclude=" is required for each pattern separately, so this thing does not work: du -sh /* --exclude=echo $(df -hTP -t xfs | grep -v File | awk '{print $NF}')`` Apr 21 at 3:55
3

du is doing exactly what you told it to do.

-x skips directories on different file-systems, but it will do that for each and every one of the non-option arguments on the command line.

When you run du -x -sh /*, you are telling du to give you the details on ALL of the files and directories in /, regardless of whether they are mount-points for other file-systems or not.

What you probably want to do is use du's -d (aka --max-depth) option. e.g.

# du -h -x -d 1 /
512     /media
8.7M    /var
512     /srv
1.4G    /opt
10K     /tmp
512     /mnt
512     /boot
1.1M    /etc
13K     /run
512     /home
97M     /usr
1.5G    /

Notice how other file-systems (e.g. /proc) are excluded from the output - that's because while they match the -d 1 maximum depth, they are also separate file-system from / itself, so -x excludes them and du never descends into those mount-points.

Note: -d is a non-standard (i.e. non-POSIX) option for du. It is, however, available in both GNU and *BSD versions of du, and probably many others too. i.e. this will definitely work on Linux and FreeBSD and almost certainly on other modernish unix-like systems, but may not work on ancient or proprietary unixes.

The man page extract in your question (-x, --one-file-system skip directories on different file systems) indicates that you are using the GNU version of du from GNU coreutils.

2
  • If i helps clarify, to a shell (such as bash, [t]csh, zsh, etc) in a un*x environment, the parameters '/' and '/*' are two very different things. '/' passes du only the directory name of '/', while '/*' looks up every name in the / directory, and passes the whole list (without the '/*') to du. du then happily processes the whole list including the other mount points which are part of that list. So only use '/' and not '/*' if you only want the filesystem mounted on '/' (i.e.: the root filesystem).
    – C. M.
    Apr 21 at 8:57
  • 1
    Running "du -h -x -d 1 /" also lists "/home", "/tmp", "/boot" and others which are separate filesystems / mountpoints in which I am not interested. If I get an alert stating "/ is 95% full" then I don't want to look at the contents of "/home" or "/tmp" which have no disk space issue. Also, without "-s" the size info for directories is not provided. What you get is a metadata only. On my production system it is showing "4.0K /home", for example. May 14 at 6:51

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.