rsync --link-dest
Wie kann ich anhand platzsparender Schnappschüsse herausfinden, wie viel Speicherplatz ich tatsächlich gespart habe? Oder allgemeiner:
Wie kann man herausfinden, wie viel Speicherplatz ein Verzeichnis belegt, wenn man nur Dateien berücksichtigt, die an keiner anderen Stelle außerhalb der Verzeichnisstruktur fest verlinkt sind? Anders gefragt: Wie viel Speicherplatz würde nach dem Löschen dieses Verzeichnisses tatsächlich freigegeben werden? (
du -hs
würde lügen. Der Platz, der für die Hardlinks selbst benötigt wird, kann enthalten sein)
disk-usage
hard-link
Tobias Kienzler
quelle
quelle
du
die Dateigrößen nur einmal, auch wenn sie fest miteinander verknüpft sind, es sei denn, Sie verwenden die Option-l
/--count-links
. Sie werdendu
zweimal mit und ohne diese Option auf dem gesamten Baum ausgeführt. Der Unterschied zwischen den Größen sollte darin bestehen, wie viel Speicherplatz Sie in allen Verzeichnissen gespeichert haben.Antworten:
Vorausgesetzt, es gibt keine internen Hardlinks (dh jede Datei mit mehr als einem Hardlink ist von außerhalb des Baums verlinkt), können Sie Folgendes tun:
BEARBEITEN Und hier ist, was ich in dem Kommentar skizziert habe, angewendet. Nur ohne
du
; Ein großes Lob an @StephaneChazelas für das Bemerkendu
ist nicht erforderlich. Erklärung am Ende.Wir erstellen eine Zeichenfolge mit der Datenträgerverwendung (in KB) jeder relevanten Datei, die durch Pluszeichen getrennt ist. Dann füttern wir diese große Zugabe zu
bc
.Der erste
find
Aufruf erledigt das für Verzeichnisse.Die zweite
find
Option gibt die Anzahl der Links, den Inode und die Festplattennutzung aus. Wir durchlaufen diese Listesort | uniq -c
, um eine Liste zu erhalten (Anzahl der Auftritte im Baum, Anzahl der Links, Inode, Festplattennutzung).Wir durchlaufen diese Liste
awk
und drucken das vierte Feld, wenn das erste Feld (Anzahl der Erscheinungsbilder) größer oder gleich dem zweiten Feld (Anzahl der Hardlinks) ist, dh, es gibt keine Links zu dieser Datei von außerhalb des Baums. Datenträgernutzung) mit einem Pluszeichen und einem Backslash.Schließlich geben wir a aus
0
, damit die Formel syntaktisch korrekt ist (es würde+
sonst en geben ) und übergeben sie anbc
. Puh.(Aber ich würde die einfachere erste Methode verwenden, wenn sie eine ausreichend gute Antwort liefert.)
quelle
find
eine Liste aller Dateien mit ihren Inodes und der Anzahl der Links gedruckt werden. dann eine Kombination vonsort | uniq -c
, um zu ermitteln, wie oft jeder Inode im Baum erscheint, dann diejenigen mit einer Linkanzahl herauszufiltern, die größer als die Anzahl der Auftritte ist ... und dann diese Liste zu fütterndu
. Wenn die Anforderung jedoch erfüllt ist, sparen Sie den Aufwand.du
einen-d
ähnlichen Parameter wiels
's ...btrfs
Dateisystemen immer die Anzahl der Links für Verzeichnisse angegeben ist.1
! -type d
Grundsätzlich müssen Sie die Inode-Nummern und die Anzahl der Verknüpfungen für alle Dateien (Nicht-Verzeichnisse) ermitteln, diese Anzahl der Verknüpfungen mit der Anzahl der Vorkommen der einzelnen Inodes vergleichen und die Datei ausschließen, wenn sie unterschiedlich sind.
Vorausgesetzt, sie befinden sich alle im selben Dateisystem, so etwas sollte funktionieren (mit GNU find):
quelle
%k
. Das ist toll,du
wird gar nicht benötigt! Ich werde meine Antwort aktualisieren, wenn ich nach Hause komme. Vielen Dank!du
Tatsächlich lügt es nicht;) Es analysiert die Verzeichnisse, die es gibt, wobei nur die ersten Hardlinks gezählt werden, die auf den gleichen Inode verweisen, auf den es stößt.Wenn Sie fragen,
du
was es nur in einem Verzeichnis sieht, ist es egal, dass es andere feste Links gibt, die auf den gleichen Inhalt verweisen:Geben Sie nun dirs in dieselbe Zeile (beginnend mit der neuesten Zeile für inkrementelle rsync-Sicherungen mit
--link-dest
):Oder das ganze Backup-Verzeichnis:
Alle Dateien in 'daily.1', die auf einen Inode verweisen (auch als "echte" Dateien bezeichnet), auf die bereits in 'daily.0' verwiesen wurde, werden nicht gezählt.
Das Löschen von daily.1 spart daher 364 MB auf Ihrem Gerät.
ENTFERNEN
quelle