Supondo que não há links internos (ou seja, cada arquivo com mais de um link está vinculado fora da árvore), você pode fazer:
find . -links -2 -print0 | du -c --files0-from=-
EDITAR E aqui está o que eu esbocei no comentário, aplicado. Apenas sem du
; Muitos elogios para @StephaneChazelas por perceber du
não são necessários. Explicação no 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
O que fazemos é criar uma string com o uso do disco (em KB) de cada arquivo relevante, separado por sinais de mais. Então nós alimentamos essa grande adição a bc
.
A primeira invocação de find
faz isso para diretórios.
O segundo find
imprime a contagem de links, o inode e o uso do disco. Passamos essa lista através de sort | uniq -c
para obter uma lista de (número de aparições na árvore, contagem de links, inode, uso de disco).
Passamos essa lista por awk
e, se o primeiro campo (nº de aparências) for maior ou igual ao segundo (# de hardlinks), o que significa que não há links para este arquivo de fora da árvore, em seguida, imprima o quarto campo (uso do disco) com um sinal de mais e uma barra invertida anexada.
Por fim, geramos um 0
, portanto, a fórmula está sintaticamente correta (seria em +
caso contrário) e passaria para bc
. Ufa.
(Mas eu usaria o primeiro método mais simples, se ele der uma resposta boa o suficiente.)