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 +1
weist 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) find
den 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 -l
diese 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.