Wie entferne ich Hardlinks unter Ubuntu, ohne die Originaldatei zu verlieren?

Wie entferne ich Hardlinks unter Ubuntu, ohne die Originaldatei zu verlieren?

Ich verwende Ubuntu und dropbox. Das Problem ist, dass ich einige Synchronisierungsprobleme habe, weil ich viele Hardlinks in meinem Bilderordner habe.

Wie kann ich alle mit einem einfachen Befehl entfernen, OHNE Bilder zu verlieren? Für eine einzelne Datei habe ich den folgenden Befehl gefunden

find /home -xdev -samefile "filename" | xargs rm

Aber ich weiß nicht, wie ich das für alle Dateien machen soll?

Danke im Voraus

Informationen zu meinem Dateisystem:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  7,7G     0  7,7G   0% /dev
tmpfs          tmpfs     1,6G  2,4M  1,6G   1% /run
/dev/nvme0n1p3 ext4      435G  203G  211G  50% /
tmpfs          tmpfs     7,7G  756M  7,0G  10% /dev/shm
tmpfs          tmpfs     5,0M  4,0K  5,0M   1% /run/lock

Antwort1

Sie können eine Datei löschen, solange mehr als ein Hardlink darauf vorhanden ist. Die Daten werden gelöscht, wenn der letzte Hardlink entfernt wird. Die Anzahl der Links kann mit stat -c '%h' {file}(*) abgefragt werden. Sie können also alle Dateien löschen, die mehr als einen Hardlink enthalten, etwa so:

for file in *
do
   links=$(stat -c '%h' "$file")
   [[ -f "$file" ]] && [[ $links -gt 1 ]] && rm "$file" 
done

Wie sie sagen,am Ende wird es nur einen geben, und der Überlebende wird der letzte sein, der überprüft wird, abhängig von der Verarbeitungsreihenfolge des Verzeichnisses, der alphabetischen Reihenfolge usw.

(*) Es erscheint auch in der Ausgabe von ls -l, ist aber schwieriger zu analysieren ...

Antwort2

Sie können entfernen"extra"Kopien aller Dateien wie folgt:

find /home -xdev -type f -links +1 -delete

Sie sollten sich jedoch darüber im Klaren sein, dass einige dieser zusätzlichen Kopien möglicherweise mit Orten außerhalb verknüpft sind/home(und scheint möglicherweise zu fehlen).

Der-links +1weist darauf hin find, dass nur die Dateien ( -type f) ausgewählt werden sollen, die über mehr als einen Hardlink verfügen.

Sie könnten (mit mehr Aufwand) findden Inode-Wert für jede Datei drucken, das Ergebnis sortieren und (mit awk) eine Liste der zu entfernenden Dateien über schreiben xargs, aber dabei würden Sie auf Probleme mit Dateinamen mit Sonderzeichen (einschließlich Leerzeichen) stoßen. Aber so könnten Sie Überraschungen vermeiden, wenn eine Datei außerhalb von verknüpft ist./home.

Antwort3

Unter Unix/Linux/MacOS verweist ein Dateiname in einem Verzeichnis auf einen Inode (indirekten Knoten), also die Struktur auf der Festplatte, dieWirklichist die Datei. Diese Zuordnung eines Namens zu einem Inode nennt manFester Linkim Gegensatz zu einemSoftlinkdas ist im Wesentlichen nur eine Datei, die den Namen enthält, unter dem die Datei gefunden werden kann. Softlinks können beschädigt werden, wenn ein Teil des Pfads zur verlinkten Datei umbenannt oder entfernt wird, während das Umbenennen/Verschieben eines Hardlinks die anderen überhaupt nicht beeinflusst.

Es gibt also keine "Originaldatei",alleHardlinks haben genau denselben Status. Der Inode zeichnet auf, wie viele Hardlinks auf die Datei verweisen ( ls -ldiese Zahl wird als zweites Feld angezeigt; sie ist normalerweise 1 für Dateien (nur ein Link) und 2 für Verzeichnisse (der Link im übergeordneten Verzeichnis und '.' im Verzeichnis selbst; wenn Unterverzeichnisse vorhanden sind, verweist jedes über '..' auf sein übergeordnetes Verzeichnis und somit wächst die Anzahl). Der von der Datei verwendete Speicherplatz wird freigegeben, wenn die Anzahl der Links 0 erreicht.

verwandte Informationen