Supponendo che non ci siano hardlink interni (ovvero, ogni file con più di 1 hardlink sia collegato dall'esterno dell'albero), puoi fare:
find . -links -2 -print0 | du -c --files0-from=-
EDIT Ed ecco quello che ho abbozzato nel commento, applicato. Solo senza du; complimenti a @StephaneChazelas per aver notato che dunon è necessario. Spiegazione alla fine.
( find . -type d -printf '%k + ' ; \
find . \! -type d -printf '%n\t%i\t%k\n' | \
sort | uniq -c | \
awk '$1 >= $2 { print $4 " +\\" }' ; \
echo 0 ) | bc
Quello che facciamo è creare una stringa con l'utilizzo del disco (in KB) di ogni file rilevante, separato da segni più. Quindi alimentiamo quella grande aggiunta a bc.
La prima findinvocazione lo fa per le directory.
Il secondo findstampa il conteggio dei collegamenti, l'inode e l'utilizzo del disco. Passiamo attraverso questo elenco sort | uniq -cper ottenere un elenco di (numero di aspetti nella struttura, conteggio dei collegamenti, inode, utilizzo del disco).
Passiamo che la lista attraverso awk, e, se il primo campo (numero di presenze) è maggiore o uguale al secondo (# di collegamenti fisici), il che significa che non ci sono link a questo file al di fuori della struttura, quindi stampare il quarto campo ( utilizzo del disco) con un segno più e una barra rovesciata allegata.
Alla fine produciamo a 0, quindi la formula è sintatticamente corretta ( +altrimenti sarebbe en ) e la passiamo a bc. Uff.
(Ma userei il primo metodo più semplice, se dà una risposta abbastanza buona.)
duconta le dimensioni dei file solo una volta anche se sono strettamente collegate a meno che non si usi l' opzione-l/--count-links. Corridusull'intero albero due volte, con e senza quell'opzione e la differenza tra le dimensioni dovrebbe essere la quantità di spazio che hai salvato su tutte le directory.