du -x
(pelo menos GNU e busybox du
) é enganado pelos bind-mounts do Linux porque os arquivos têm o mesmo device-id, então você precisa remover manualmente os mount-points. Com o GNU du
:
du -xhs --exclude=./bind/mount/point
Como alternativa, você pode usar o GNU find
para localizar os arquivos e imprimir o uso do disco, chamando o comando mountpoint
para saber quais diretórios devem ser removidos (que são montagens de ligação). Em seguida, use awk
para fazer as somas (contando apenas hardlinks uma vez, como du
):
find . -xdev ! -name . -type d -exec mountpoint -q {} \; -prune -o \
-printf '%i %b\n' |
awk '!seen[$1]++ {s+=$2}
END{printf "%.17g\n", s * 512}' |
numfmt --to=iec
Isso é bastante ineficiente, já que precisa executar o comando mountpoint
para cada diretório (note que também é possível montar arquivos não-diretórios de montagem de bind, estamos assumindo que não é feito para evitar a execução de mountpoint
on cada arquivo).