Używając rsync --link-dest
migawek zajmujących mało miejsca, jak mogę dowiedzieć się, ile faktycznie zaoszczędziłem? Lub bardziej ogólnie:
Jak obliczyć, ile miejsca zajmuje katalog, biorąc pod uwagę tylko pliki, które nie są dowiązane w inny sposób poza strukturą katalogu? Pytanie zadane inaczej: Ile miejsca faktycznie zostanie zwolnione po usunięciu tego katalogu? (
du -hs
kłamałby. Można uwzględnić miejsce wymagane na same linki twarde)
disk-usage
hard-link
Tobias Kienzler
źródło
źródło
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.Odpowiedzi:
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:
EDYCJA I oto, co naszkicowałem w komentarzu, zastosowałem. Tylko bez
du
; pochwały dla @StephaneChazelas za zauważeniedu
nie jest konieczne. Wyjaśnienie na końcu.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 dobc
. Uff(Ale użyłbym pierwszej prostszej metody, jeśli daje wystarczająco dobrą odpowiedź.)
źródło
find
wydrukowanie listy wszystkich plików z ich i-węzłami i liczbą linków; następnie jakąś kombinację,sort | uniq -c
aby dowiedzieć się, ile razy każdy i-węzeł pojawia się w drzewie, a następnie odfiltrować te, których liczba łączy jest większa niż liczba wystąpień ... a następnie przesłać listędu
. Ale jeśli warunek jest spełniony, lepiej oszczędzaj wysiłek.du
miał-d
parametr podobny dols
...btrfs
systemach plików liczba linków do katalogów jest zawsze1
, więc musisz dodać! -type d
Zasadniczo musisz uzyskać numery i-węzłów i liczbę dowiązań dla wszystkich plików (bez katalogów), porównać tę liczbę dowiązań z liczbą wystąpień każdego i-węzła, a jeśli się różnią, wyklucz plik.
Zakładając, że wszystkie są w tym samym systemie plików, coś takiego powinno działać (z GNU find):
źródło
%k
zgłoszono. To świetnie,du
wcale nie jest potrzebne! Zaktualizuję swoją odpowiedź, kiedy wrócę do domu. Dzięki!du
tak naprawdę nie będzie kłamać;) Analizuje katalog, który daje, licząc tylko pierwsze hardlinks wskazujące na ten sam i-węzeł, który napotyka.Jeśli zapytasz,
du
co widzi tylko w jednym katalogu, nie ma znaczenia, że istnieją inne twarde linki prowadzące do tej samej zawartości:Teraz nadaj mu katalogi w tym samym wierszu (zaczynając od najnowszego dla przyrostowych kopii zapasowych rsync z
--link-dest
):Lub cały katalog kopii zapasowej:
Jakikolwiek plik w „Daily.1” odwołujący się do i-węzła (inaczej „plik rzeczywisty”) już wymieniony w „Daily.0” nie będzie liczony.
Dlatego codzienne usuwanie 1 pozwoli zaoszczędzić 364 MB na urządzeniu.
USUNĄĆ
źródło