Was ist die beste Möglichkeit, die Verknüpfung fest verknüpfter Dateien aufzuheben?

Was ist die beste Möglichkeit, die Verknüpfung fest verknüpfter Dateien aufzuheben?

rdfindIch habe viele fest verknüpfte Dateien gefunden (~60-90) und möchte die Verknüpfung aller aufheben. Eine mögliche Lösung besteht darin, einfach alle Dateien zu finden , -link +1 sie zu kopieren, zu löschen und sie wieder auf den Verknüpfungsnamen zu verschieben.

Gibt es eine bessere Lösung? Gibt es einen einfacheren Weg, dies zu tun?

Antwort1

Du kannst tun:

find . -type f -links +1 -exec sh -c '
  { rm -f "$1" && cat > "$1"; } < "$1"' sh {} \;

aber dadurch bleiben die Dateimetadaten nicht erhalten. Unter Linux können Sie stattdessen Folgendes tun:

find . -type f -links +1 -exec sh -c '
  { rm -f "$1" && cp -p /proc/self/fd/0 "$1"; } < "$1"' sh {} \;

Beachten Sie, dass bei einem Fehler catoder cp(z. B. bei voller Festplatte) der Inhalt der Datei verloren geht, die cat/ cpnicht kopieren konnte.

Wir verwenden -exec {} \;anstelle von -exec {} +, damit die Linkanzahl der Datei aktualisiert wird, nachdem die Datei gefunden wurde, so dass findnichtfindender letzte Link, wenn die Linkanzahl auf 1 gesunken ist (was bedeutet, dass für eine Datei mit einer anfänglichen Linkanzahl von 4 nur 3 Instanzen überschrieben werden).

Mit GNU tarkönnen Sie außerdem Folgendes tun:

find . -type f -links +1 -print0 |
  tar --hard-dereference --null -T - -cf - | tar xpf -

Dadurch werden weniger Befehle ausgeführt, aber mehr Dateien überschrieben.

Möglicherweise sehen Sie einige davon:

tar: ./file: file changed as we read it

für große Dateien, aber das ist OK, da der zweite tardie Datei vor dem Überschreiben entkoppelt, also ist das im Endeffekt dem ersten Ansatz sehr ähnlich. Der erste tarbemerkt nur, dass die Anzahl der Verknüpfungen abnimmt (und sich dadurch die ctime ändert), wenn der zweite Tar die Datei entkoppelt.

verwandte Informationen