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 du
nie 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 find
wywołanie robi to dla katalogów.
Drugi find
drukuje liczbę linków, i-węzłów i użycie dysku. Przekazujemy tę listę, sort | uniq -c
aby 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ź.)
du
zlicza rozmiary plików tylko raz, nawet jeśli są one mocno połączone, chyba że użyjesz opcji-l
/--count-links
. Uruchomićdu
na 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.