Zachowanie polecenia `du` z flagą` -L`

11

Zauważyłem dziwne zachowanie dupolecenia, gdy jest ono używane z -Lopcją 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?

Zagorax
źródło
wygląda na to, że duchce grać tutaj sprytnie, ale jeśli uruchomisz, df -a -L bar foowyjście jest bardzo złe (liczenie 16K w takcie pozostawia foo puste).
guido

Odpowiedzi:

18

Domyślnie duzlicza każdy plik tylko raz, jeśli jest połączony wiele razy. Jeśli uruchomisz du -L bar, policzy plik, ponieważ osiągnie go tylko raz. Jeśli jednak uruchomisz program du -L *, policzy go tylko za pierwszym razem, gdy go zobaczy. Na przykład:

$ du -L foo bar
16K     foo
4.0K    bar

$ du -L bar foo
16K     bar
4.0K    foo

Zauważ, że zamiana kolejności argumentów zmienia folder, który zostanie zgłoszony jako 16 KB.

Możesz wymusić duliczenie pliku dwa razy, przekazując -lparametr.

Edytować:

Dowiązania symboliczne są specjalnym rodzajem pliku i potrzebny jest dodatkowy krok, aby podążać za dowiązaniem. dunie będzie podążał za dowiązaniami symbolicznymi, chyba że -Lopcja jest włączona.

Z drugiej strony, twardy link to w zasadzie jeden plik istniejący w dwóch (lub więcej) folderach. duprawdopodobnie śledzi, które pliki widział według numeru i-węzła, aby uniknąć ich dwukrotnego liczenia. -lwyłącza to zachowanie.

Więc po prostu -Lbę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 -li -Lrazem, będzie on podążał za dowiązaniami symbolicznymi, a także pozwoli policzyć pliki docelowe więcej niż jeden raz.

David Baggerman
źródło
Dziękuję Ci. To działa. Chciałbym jednak uzyskać dodatkowe wyjaśnienia. Na stronie podręcznika czytam, że -ltak count sizes many times if hard linked, ale tutaj pracuję z dowiązaniem symbolicznym. Co więcej, -lsam nie rozwiąże problemu, a jeśli mogę używać zarówno -li -Lliczy się rozmiar prawidłowo.
Zagorax,
@Zagorax Tak, strona podręcznika jest nieco niejasna w kwestii sposobu -li -Linterakcji. Wyjaśnienie trochę za długo na komentarz, więc zaktualizowałem swoją odpowiedź.
David Baggerman