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.
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:
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 .)
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.
/dev/${uniquename}
Verzeichnis ist bereits vorhanden/myfile
und/dev/{uniquename}/.
befindet sich im selben Dateisystem.Antworten:
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.quelle
Der Befehl zum Entfernen einer festen Verbindung lautet
rm
.Aus der Manpage für
rm
:quelle
Ich bin mir Ihrer Bedeutung ein wenig unsicher, aber ich denke, Ihr Skript wird
/myfile
als Hardlink zu/dev/…/myfile
letzterem 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:
quelle
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 vonrm
und es gibt immer eine implizite-f
Option (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
unlink
Dienstprogramm durch Hinzufügen von Unterstützung für Befehlszeilenoptionen lahmgelegt hat! Entferntunlink -t
also keine Datei, die-t
auf einem Linux-System oder einem anderen System mit den GNU-Coreutils benannt ist.(Ja, das weiß ich
rm -- -t
oderunlink -- -t
funktioniert, dazu muss ich nichts sagen .)quelle
unlink -f foobar
gibtusage: 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.unlink
keine Optionen haben darf, wie es für echounlink
Dienstprogramm, obwohl es Standard ist, so dunkel, dass OpenBSD es nicht einmal in seinem Basissystem hat.