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 du
non è 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 find
invocazione lo fa per le directory.
Il secondo find
stampa il conteggio dei collegamenti, l'inode e l'utilizzo del disco. Passiamo attraverso questo elenco sort | uniq -c
per 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.)
du
conta le dimensioni dei file solo una volta anche se sono strettamente collegate a meno che non si usi l' opzione-l
/--count-links
. Corridu
sull'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.