Verhalten des Befehls "du" mit dem Flag "-L"

11

Ich habe ein seltsames Verhalten mit duBefehl bemerkt, wenn es mit -LBefehlszeilenoption verwendet wird.

Ich verwende Slackware 14 und Coreutils 8.19.

Erstellen Sie zwei Ordner, um das seltsame Verhalten zu reproduzieren:

mkdir foo
mkdir bar

Erstellen Sie eine Datei in einem der Ordner:

perl -e 'print "A"x10000' > foo/text

Und ein Symlink im anderen Ordner:

ln -s ../foo/text bar/text

Wenn Sie jetzt Folgendes eingeben:

du -h -L bar

Du wirst kriegen:

16k bar

Da wurde der Symlink dereferenziert. Aber wenn Sie eingeben:

du -h -L *

Du wirst kriegen:

16K     foo
4.0K    bar

Und der Symlink wird nicht dereferenziert. Vermisse ich etwas

Zagorax
quelle
es scheint duhier klug spielen zu wollen, aber wenn Sie laufen, ist df -a -L bar foodie Ausgabe sehr falsch (das Zählen der 16K in bar lässt foo leer).
Guido

Antworten:

17

Standardmäßig duwird jede Datei nur einmal gezählt, wenn sie mehrmals verknüpft ist. Wenn Sie es ausführen du -L bar, wird die Datei gezählt, da sie nur einmal erreicht wird. Wenn Sie es jedoch ausführen du -L *, wird es nur gezählt , wenn es zum ersten Mal angezeigt wird. Beispielsweise:

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

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

Beachten Sie, dass durch das Austauschen der Reihenfolge der Argumente geändert wird, welcher Ordner als 16 KB gemeldet wird.

Sie können dudas zweimalige Zählen der Datei erzwingen , indem Sie den -lParameter übergeben.

Bearbeiten:

Symbolische Links sind eine spezielle Art von Datei, und ein zusätzlicher Schritt ist erforderlich, um dem Link zu folgen. dufolgt keinen symbolischen Links, es sei denn, die -LOption ist aktiviert.

Ein fester Link ist im Grunde eine Datei, die in zwei (oder mehr) Ordnern vorhanden ist. duVerfolgt vermutlich anhand der Inode-Nummer, welche Dateien es gesehen hat, um zu vermeiden, dass diese zweimal gezählt werden. -lDeaktiviert dieses Verhalten.

Mit just -Lfolgt es also dem symbolischen Link, aber wenn die Zieldatei eine Inode-Nummer hat, die sie bereits gesehen hat, wird sie nicht erneut gezählt. Mit nur wird -les doppelte harte Links zählen, aber nicht symbolischen Links folgen.

Wenn Sie -lund -Lzusammen verwenden, folgt es sowohl den symbolischen Links als auch dem mehrmaligen Zählen der Zieldatei (en).

David Baggerman
quelle
Vielen Dank. Das funktioniert. Ich hätte jedoch gerne eine zusätzliche Erklärung. Auf Manpage, las ich , dass -ltut count sizes many times if hard linked, aber hier arbeite ich mit Symlink. Darüber hinaus -llöst allein nicht das Problem, während, wenn ich beide benutze -lund -Les die Größe richtig zählt.
Zagorax
@Zagorax Ja, die Manpage ist etwas unklar, wie -lund wie sie -Linteragieren. Die Erklärung wurde für einen Kommentar etwas zu lang, daher habe ich meine Antwort aktualisiert.
David Baggerman