Ejecutar «du» excluyendo directorios de otros filesystems o puntos de montaje

No sabía muy bien cómo explicar claramente de qué va este artículo con el poco espacio que deja el título. Básicamente se trata de poder ejecutar un análisis del espacio utilizado en un sistema de ficheros con du, pero evitando que al ejecutarlo también analice otros filesystems cuyo punto de montaje se encuentra en niveles «interiores» de ese FS.

Un claro ejemplo sería si quisiéramos saber el espacio ocupado en el filesystem raíz /, pero evitando otros sistemas de ficheros montados como pueden ser /home, /tmp, etc:

[root@foo /]# df -h
Filesystem                        Size  Used Avail Use% Mounted on
devtmpfs                          2.0G     0  2.0G   0% /dev
tmpfs                             2.0G     0  2.0G   0% /dev/shm
tmpfs                             2.0G  1.1M  2.0G   1% /run
tmpfs                             2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/mapper/fedora_nostromo-root   14G  8.6G  4.7G  65% /
tmpfs                             2.0G  1.1M  2.0G   1% /tmp
/dev/sda1                         240M  182M   42M  82% /boot
tmpfs                             395M   12K  395M   1% /run/user/1000

Si aquí ejecutamos el típico du -h con una profundidad de un único nivel, ocurre esto:

[root@foo /]# du -h --max-depth=1  /
27M	/etc
4.0K	/mnt
4.3G	/usr
0	/sys
0	/dev
1.1M	/run
4.0K	/srv
181M	/boot
8.0K	/tmp
4.0K	/media
4.0K	/opt
1.4G	/var
144K	/root
0	/proc
16K	/lost+found
3.0G	/home
8.8G	/

No sólo estamos analizando /, sino también todos los filesystems montados dentro de ese path. Para evitar esto, du tiene la opción -x o --one-file-system:

[root@foo /]# du --help | grep one
  -x, --one-file-system    skip directories on different file systems

Gracias a esa opción, se saltan/excluyen todos los directorios que pertenezcan a otros filesystems:

[root@foo /]# du -h --max-depth=1  --one-file-system /
27M	/etc
4.0K	/mnt
4.3G	/usr
4.0K	/srv
4.0K	/media
4.0K	/opt
1.4G	/var
144K	/root
16K	/lost+found
3.0G	/home
8.6G	/

Como podéis observar, no se han analizado los directorios que, en ese primer nivel, forman parte de otros filesystems. Lo mismo se puede hacer con más niveles de recursión:

[root@foo /]# du -h --max-depth=2  --one-file-system /
16K	/etc/yum
340K	/etc/xdg
8.0K	/etc/fcoe
104K	/etc/alternatives
4.0K	/etc/depmod.d
8.0K	/etc/ld.so.conf.d
12K	/etc/udisks2
4.0K	/etc/gnupg
12K	/etc/openldap
24K	/etc/pulse
20K	/etc/yum.repos.d
16K	/etc/kernel
[...]