Richtige Verknüpfung von Hardlinks

7

Ich habe ein Skript, das so aussieht

ln /myfile /dev/${uniquename}/myfile

Ich möchte den Link von entfernen /dev/somename/myfile, um die Anzahl der Links zu verringern.

Wie mache ich das?

e_mam106
quelle
Ihr Skript schlägt fehl, es sei denn, ein /dev/${uniquename}Verzeichnis ist bereits vorhanden /myfileund /dev/{uniquename}/.befindet sich im selben Dateisystem.
Mosvy

Antworten:

13

TL; DR ... löschen Sie einfach den Dateinamen, den Sie nicht möchten (mit rm).

Wenn Sie einen festen Link erstellen (wie in Ihrem obigen Befehl beschrieben), haben Sie zwei Namen, die auf denselben Speicherbereich verweisen. Sie können jeden Namen löschen, ohne den anderen Namen oder den Speicher zu beeinflussen. Erst wenn der Nachname entfernt wird, wird der Speicherbereich freigegeben.

Vergleichen Sie dies mit Softlinks ... erstellt mit ln -s- dort ist der Link anders, es ist eher ein Zeiger auf den ursprünglichen Namen als ein Zeiger auf den Speicher. Wenn Sie die ursprünglich benannte Datei löschen, verweisen die Softlinks auf etwas, das gelöscht wurde. Der Link bleibt also bestehen, ist jedoch fehlerhaft.

houninym
quelle
8

Der Befehl zum Entfernen einer festen Verbindung lautet rm.

Aus der Manpage für rm:

Remove (unlink) the FILE(s).
user4556274
quelle
1

Ich bin mir Ihrer Bedeutung ein wenig unsicher, aber ich denke, Ihr Skript wird /myfileals Hardlink zu /dev/…/myfileletzterem erstellt , und dann möchten Sie letzteres entfernen.

Wenn dies korrekt ist, können Sie anstelle der Verknüpfung und dann der Entfernung der Verknüpfung einfach die Datei verschieben und das gleiche Ergebnis in einem einzigen Befehl (mv) anstelle von zwei Befehlen (ln und rm) erzielen:

mv   /dev/…/myfile   /
WGroleau
quelle
0

Die meisten vorhandenen Antworten befürworten die Verwendung rm. Dies ist völlig korrekt, da Sie keine Dateien entfernen: Sie entfernen Links (und die Datei wird entfernt, wenn der letzte darauf verweisende Link entfernt und der letzte geöffnete Dateideskriptor geschlossen wird).

Sie sollten sich jedoch auch eines anderen Dienstprogramms bewusst sein unlink. Es fehlen die Optionen von rmund es gibt immer eine implizite -fOption (irgendwie - es wird jedoch bei einer fehlenden Datei fehlschlagen). Der Vorteil ist, dass Sie eine Datei, die mit einem Bindestrich beginnt, zumindest theoretisch entfernen können ...

... außer Sie können nicht, wenn Sie ein Linux-System verwenden, weil die GNU das unlinkDienstprogramm durch Hinzufügen von Unterstützung für Befehlszeilenoptionen lahmgelegt hat! Entfernt unlink -talso keine Datei, die -tauf einem Linux-System oder einem anderen System mit den GNU-Coreutils benannt ist.

(Ja, das weiß ich rm -- -toder unlink -- -tfunktioniert, dazu muss ich nichts sagen .)

juhist
quelle
Ich sehe, es gibt einen GNU-Fan, der mich abstimmt, und einen BSD-Fan, der mich gleichzeitig abstimmt.
Juhist
3
auf dem Mac unlink -f foobargibt usage: rm [-f | -i] [-dPRrvW] file ...es also nicht nur GNU. Auch wenn es so war, na und? Wenn Sie Dateinamen haben, die mit Bindestrichen beginnen, müssen Sie wissen, ob sie verwendet werden sollen, --oder ./irgendwann hilft es nicht viel, wenn es nur eine Anwendung gibt, die keine Befehlszeilenoptionen verwendet.
Ilkkachu
Nun, GNU und MacOS X scheinen dann beide verkrüppelt zu sein. Der POSIX-Standard besagt eindeutig, dass Unlink
juhist
1
Mit dieser Logik sind fast alle GNU- und BSD-Utils "verkrüppelt", da sie Optionen unterstützen, die in POSIX nicht angegeben sind. Beachten Sie, dass es nicht ausdrücklich heißt, dass diese Implementierung von unlinkkeine Optionen haben darf, wie es für echo
ilkkachu
Um den Kommentar von ilkkachu zu ergänzen, ist das unlinkDienstprogramm, obwohl es Standard ist, so dunkel, dass OpenBSD es nicht einmal in seinem Basissystem hat.
Kusalananda