Wie bestimmen Sie, welchen Hardlink Sie ignorieren sollten?

5148
Belmin Fernandez

Wir haben zwei Verzeichnisse:

$ ls -l total 8 drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 jeter drwxr-x--- 2 nimmy nimmy 4096 Nov 15 19:42 mariano 

Ich erstelle eine Datei im ersten Ordner:

$ dd if=/dev/zero of=jeter/zero_file.1 bs=512000 count=1 1+0 records in 1+0 records out 512000 bytes (512 kB) copied, 0.268523 s, 1.9 MB/s 

Dies ist die Ausgabe von du:

$ du -sh * 504K jeter 4.0K mariano 

Wie erwartet, ändert sich die Ausgabe zero_file.in dem anderen Ordner dunicht, wenn ich eine feste Verknüpfung von der in den anderen Ordner platziere :

$ ln jeter/zero_file.1 mariano/zero_file.2 $ du -sh * 504K jeter 4.0K mariano 

Soweit mir bekannt ist, gibt es im Dateisystem nichts, was auf zero_file.1die Originaldatei verweist . Also woher duweiß man zero_file.1nicht, aber nicht zero_file.2?

Es kann kein Zeitstempelvergleich sein, da alle harten Links einen Inode teilen. sie werden die gleichen Zeitstempeldaten haben?

5

4 Antworten auf die Frage

11
roguesys

Wenn Sie Ihren Test auf drei Ordner erweitern, können Sie feststellen, dass nur der erste Treffer des Inodes dies duzählt. Wenn Sie in den einzelnen Ordner gehen und ausführen du, erhalten Sie die volle Größe.

Zu testen:

mkdir alexandru ln mariano/zero_file.2 alexandru/zero_file.0 du -sh * 

Sie sollten jetzt alexandrudie 500K + aufnehmen. duIch schätze also, ohne sich den Code anzusehen, speichert er eine Liste der durchlaufenen Inodes und greift die bereits gesehenen nicht erneut auf.

Aha. Er durchquert die Verzeichnisse alphabetisch und verfolgt die gesehenen Inodes. Zumindest ist das, was weitere Tests auf meiner Seite ergeben. Belmin Fernandez vor 13 Jahren 1
Ich glaube, dass Sie Verzeichnisse in den oben genannten Fällen nur alphabetisch durchlaufen, da der Glob auf diese Weise den Platzhalter * erweitert. Ich könnte mich irren, aber ich empfehle nicht, auf die alphabetische Reihenfolge zu zählen. Slartibartfast vor 13 Jahren 5
@Slartibartfast, Sie sind richtig und führen 'ls | sort -r | xargs du -hs` zeigt den letzten Ordner als 500 K an. Er verfolgt also Inodes in der Reihenfolge, in der sie sie sehen, ob dies alphabetisch oder anders ist. roguesys vor 13 Jahren 2
4
SilverWave

Wenn Sie tun

du -sh jeter jeter mariano 

Dann erhalten Sie 2 verschiedene Größen für Jeter.

Dies scheint mit der obigen Feststellung übereinzustimmen ...

... außer dass der 1. Wert nicht die Summe und der 2. Wert Null sein sollte?

Obwohl komisch, stimmt das mit Dennis Williamsons erstem POSIX-Zitat überein, das besagt, dass der Inode nur für "Dateien mit mehreren Links" in Erinnerung bleibt, was bedeutet, dass Dateien, die nur einen einzigen (harten) Link haben, bei jeder Aufnahme des Verzeichnisses gezählt werden. Die mit mehreren Links werden nur beim ersten Mal gezählt. +1, um einen interessanten Randfall zu finden. Dave Sherohman vor 13 Jahren 0
3
Dennis Williamson

Wenn anscheinend fstat(3)die Anzahl der harten Links größer als eins ist, wird die Inode-Nummer für den nachfolgenden Abgleich aufgezeichnet. Nach POSIX :

Dateien mit mehreren Links werden nur für einen Eintrag gezählt und geschrieben. Der im Bericht ausgewählte Verzeichniseintrag ist nicht angegeben.

Die Shell erweitert den *Glob in lexikalischer Reihenfolge nach POSIX :

Wenn das Muster mit vorhandenen Dateinamen oder Pfadnamen übereinstimmt, wird das Muster durch diese Dateinamen und Pfadnamen ersetzt und nach der im aktuellen Gebietsschema gültigen Sortierfolge sortiert.

Wenn du -shjedoch kein Globbing ausgeführt wird, muss die Reihenfolge auf eine bestimmte Art und Weise festgelegt werden. Es scheint jedoch, dass die Implementierung von der Implementierung abhängen muss.

Beachten Sie, dass diese beiden Befehle zu unterschiedlichen Ergebnissen führen:

du -sh jeter mariano du -sh mariano jeter 
Wenn "du -sh" ohne Globbing ausgeführt wird, hat der Benutzer (Anrufer) die Reihenfolge festgelegt, in der er die Argumente angegeben hat. (z. B. "jeter mariano" oder "mariano jeter") Wenn der Vorgang abgeschlossen ist, wird die Reihenfolge noch nicht von "du" selbst bestimmt, sondern von der Shell, wie in Ihrer zweiten zitierten POSIX-Passage. Dave Sherohman vor 13 Jahren 1
1
Udo Kaune

Wenn Sie überprüfen möchten, ob Ihre Sicherung von der rsync-Zeitmaschine funktioniert oder nicht, und möglicherweise wichtiger ist, wie viel Sicherungsspeicher Sie sparen, sollten Sie eine ls -cr | xargs du -hsAktion ausführen, die die Verzeichnisse duin der richtigen Reihenfolge zuführt (umgekehrter Erstellungszeitpunkt).

Dies ist keine Antwort auf diese Frage. Ls -c sortiert nach _inode change time_, nicht nach _create time_ (die normalerweise nicht gespeichert wird). Scott vor 9 Jahren 0