Zakładając, że nie ma wewnętrznych dowiązań twardych (to znaczy, że każdy plik z więcej niż 1 dowiązaniem twardym jest połączony spoza drzewa), możesz:
find . -links -2 -print0 | du -c --files0-from=-
EDYCJA I oto, co naszkicowałem w komentarzu, zastosowałem. Tylko bez du; pochwały dla @StephaneChazelas za zauważenie dunie jest konieczne. Wyjaśnienie na końcu.
( 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
To, co robimy, to utworzenie ciągu znaków z wykorzystaniem miejsca na dysku (w KB) każdego odpowiedniego pliku, oddzielonego znakami plus. Następnie karmimy ten duży dodatek bc.
Pierwsze findwywołanie robi to dla katalogów.
Drugi finddrukuje liczbę linków, i-węzłów i użycie dysku. Przekazujemy tę listę, sort | uniq -caby uzyskać listę (liczba wystąpień w drzewie, liczba linków, i-węzeł, użycie dysku).
Przekazujemy tę listę awk, a jeśli pierwsze pole (# wystąpień) jest większe lub równe drugiemu (# linków twardych), co oznacza, że nie ma linków do tego pliku spoza drzewa, to wydrukujemy czwarte pole ( użycie dysku) ze znakiem plus i odwrotnym ukośnikiem.
Na koniec wypisujemy a 0, więc formuła jest poprawna pod względem składniowym (w +przeciwnym razie byłaby en ) i przekazana do bc. Uff
(Ale użyłbym pierwszej prostszej metody, jeśli daje wystarczająco dobrą odpowiedź.)
duzlicza rozmiary plików tylko raz, nawet jeśli są one mocno połączone, chyba że użyjesz opcji-l/--count-links. Uruchomićduna całym drzewie dwa razy, zi bez tej opcji, a różnica pomiędzy wielkością powinna być jak dużo miejsca jest zapisany na wszystkie katalogi.