rdfind
Ich 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 cat
oder cp
(z. B. bei voller Festplatte) der Inhalt der Datei verloren geht, die cat
/ cp
nicht kopieren konnte.
Wir verwenden -exec {} \;
anstelle von -exec {} +
, damit die Linkanzahl der Datei aktualisiert wird, nachdem die Datei gefunden wurde, so dass find
nichtfindender 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 tar
kö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 tar
die Datei vor dem Überschreiben entkoppelt, also ist das im Endeffekt dem ersten Ansatz sehr ähnlich. Der erste tar
bemerkt nur, dass die Anzahl der Verknüpfungen abnimmt (und sich dadurch die ctime ändert), wenn der zweite Tar die Datei entkoppelt.