Suponiendo que no hay enlaces internos (es decir, cada archivo con más de 1 enlace está vinculado desde fuera del árbol), puede hacer lo siguiente:
find . -links -2 -print0 | du -c --files0-from=-
EDITAR Y aquí está lo que bosquejé en el comentario, aplicado. Solo sin du
; Felicitaciones a @StephaneChazelas por notar du
que no es necesario. Explicación al final.
( 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
Lo que hacemos es crear una cadena con el uso del disco (en KB) de cada archivo relevante, separados por signos más. Luego alimentamos esa gran adición a bc
.
La primera find
invocación hace eso para los directorios.
El segundo find
imprime recuento de enlaces, inodo y uso de disco. Pasamos esa lista sort | uniq -c
para obtener una lista de (número de apariciones en el árbol, recuento de enlaces, inodo, uso del disco).
Pasamos esa lista awk
y, si el primer campo (# de apariencias) es mayor o igual que el segundo (# de enlaces duros), lo que significa que no hay enlaces a este archivo desde fuera del árbol, imprima el cuarto campo ( uso del disco) con un signo más y una barra invertida adjunta.
Finalmente, sacamos a 0
, por lo que la fórmula es sintácticamente correcta (de lo +
contrario sería en ) y se la pasa a bc
. Uf.
(Pero usaría el primer método más simple, si da una respuesta lo suficientemente buena).
du
solo cuenta los tamaños de archivo una vez, incluso si están vinculados, a menos que use la opción-l
/--count-links
. Se ejecutadu
en todo el árbol dos veces, con y sin esa opción y la diferencia entre los tamaños debería ser cuánto espacio ha guardado en todos los directorios.