Zauważyłem dziwne zachowanie du
polecenia, gdy jest ono używane z -L
opcją wiersza polecenia.
Używam Slackware 14 i Coreutils 8.19.
Aby odtworzyć dziwne zachowanie, utwórz dwa foldery:
mkdir foo
mkdir bar
Utwórz plik w jednym z folderów:
perl -e 'print "A"x10000' > foo/text
I dowiązanie symboliczne w innym folderze:
ln -s ../foo/text bar/text
Teraz, jeśli wpiszesz:
du -h -L bar
Dostaniesz:
16k bar
Ponieważ dowiązanie symboliczne zostało usunięte. Ale jeśli wpiszesz:
du -h -L *
Dostaniesz:
16K foo
4.0K bar
I dowiązanie symboliczne nie zostanie usunięte. Czy coś brakuje?
symlink
disk-usage
coreutils
Zagorax
źródło
źródło
du
chce grać tutaj sprytnie, ale jeśli uruchomisz,df -a -L bar foo
wyjście jest bardzo złe (liczenie 16K w takcie pozostawia foo puste).Odpowiedzi:
Domyślnie
du
zlicza każdy plik tylko raz, jeśli jest połączony wiele razy. Jeśli uruchomiszdu -L bar
, policzy plik, ponieważ osiągnie go tylko raz. Jeśli jednak uruchomisz programdu -L *
, policzy go tylko za pierwszym razem, gdy go zobaczy. Na przykład:Zauważ, że zamiana kolejności argumentów zmienia folder, który zostanie zgłoszony jako 16 KB.
Możesz wymusić
du
liczenie pliku dwa razy, przekazując-l
parametr.Edytować:
Dowiązania symboliczne są specjalnym rodzajem pliku i potrzebny jest dodatkowy krok, aby podążać za dowiązaniem.
du
nie będzie podążał za dowiązaniami symbolicznymi, chyba że-L
opcja jest włączona.Z drugiej strony, twardy link to w zasadzie jeden plik istniejący w dwóch (lub więcej) folderach.
du
prawdopodobnie śledzi, które pliki widział według numeru i-węzła, aby uniknąć ich dwukrotnego liczenia.-l
wyłącza to zachowanie.Więc po prostu
-L
będzie podążał za dowiązaniem symbolicznym, ale jeśli plik docelowy ma numer i-węzła, to już widział, że nie zostanie ponownie zliczony. Wystarczy,-l
że policzy duplikaty twardych linków, ale nie będzie podążać za symbolicznymi linkami.Jeśli użyjesz
-l
i-L
razem, będzie on podążał za dowiązaniami symbolicznymi, a także pozwoli policzyć pliki docelowe więcej niż jeden raz.źródło
-l
takcount sizes many times if hard linked
, ale tutaj pracuję z dowiązaniem symbolicznym. Co więcej,-l
sam nie rozwiąże problemu, a jeśli mogę używać zarówno-l
i-L
liczy się rozmiar prawidłowo.-l
i-L
interakcji. Wyjaśnienie trochę za długo na komentarz, więc zaktualizowałem swoją odpowiedź.