Entfernen Sie einen Symlink zu einem Verzeichnis

1085

Ich habe einen Symlink zu einem wichtigen Verzeichnis. Ich möchte diesen Symlink loswerden und gleichzeitig das Verzeichnis dahinter behalten.

Ich versuchte es rmund kam zurück rm: cannot remove 'foo'.
Ich habe versucht , rmdirund bekam wieder rmdir: failed to remove 'foo': Directory not empty
ich dann durch fortgeschritten rm -f, rm -rfundsudo rm -rf

Dann ging ich, um meine Backups zu finden.

Gibt es eine Möglichkeit, den Symlink loszuwerden, ohne das Baby mit dem Badewasser wegzuwerfen?

Matthew Scouten
quelle
74
Was ist falsch daran, Linux-bezogene Fragen zu stellen? Als ich das letzte Mal nachgesehen habe, war der Stapelüberlauf nicht os-spezifisch
Jeremy Cantrell,
6
Wäre diese Frage nicht besser für Super User oder einen Linux-bezogenen Stack Exchange geeignet?
mwfearnley
45
@mwfearnley Es wäre, aber überprüfen Sie das Datum. Super User war damals noch keine Sache. Es wurde portiert, also ist es auch da. Ich bin mir nicht sicher, warum es immer noch hier ist, aber es ist meine Frage mit der höchsten Punktzahl und ich werde dem Geschenkkarma nicht in den Mund schauen.
Matthew Scouten
16
TIPP: rm -r link/ löscht den Inhalt auf dem Ziel
Gayan Weerakutti
31
Then I went to find my back-ups- Das hat mich zum Lachen gebracht.
frakman1

Antworten:

1308
# this works:
rm foo
# versus this, which doesn't:
rm foo/

Grundsätzlich müssen Sie ihm mitteilen, dass eine Datei gelöscht werden soll , nicht ein Verzeichnis . Ich glaube, der Unterschied zwischen rmund rmdirbesteht aufgrund von Unterschieden in der Art und Weise, wie die C-Bibliothek jeden behandelt.

In jedem Fall sollte der erste funktionieren, während der zweite sich darüber beschweren sollte, dass foo ein Verzeichnis ist.

Wenn es nicht wie oben funktioniert, überprüfen Sie Ihre Berechtigungen. Sie benötigen eine Schreibberechtigung für das enthaltende Verzeichnis, um Dateien entfernen zu können.

Matthew Scharley
quelle
121
Ah ja. Das macht Sinn. Ich habe nie foo getippt, ich habe f <tab> getippt und bash ein / für mich ausgefüllt.
Matthew Scouten
6
Das funktioniert nicht immer. Gelegentlich müssen Sie rm -rf folderName(ohne nachfolgendes /) ausführen, um den Symlink zu entfernen. Amazon Linux verhält sich beispielsweise unter bestimmten Umständen so.
Brandonscript
18
@ r3mus: Niemals -rmit einem Symlink verwenden, es sei denn, Sie möchten alles darin verlieren. -fsollte auch nicht benötigt werden, außer vielleicht, um Dateiberechtigungen zu überschreiben.
Matthew Scharley
27
Insbesondere unlinkhat keine Beziehung zur lnAKA 'Link'-Operation. Der Name unlinkbezieht sich auf den Vorgang des Aufhebens der Verknüpfung / Entfernung einer Datei aus der Dateitabelle des Dateisystems, sodass der Inhalt von jeglichen Verweisen auf sie getrennt wird - sie sind nicht mehr verbunden. Es ist ein verwirrender Name, der geradezu irreführend ist, wenn er insbesondere auf Links und Symlinks angewendet wird. unlinkfunktioniert mit Symlinks, da es mit jeder Datei unabhängig vom Typ funktioniert .
Matthew Scharley
4
Wenn Sie sich jemals Sorgen machen, etwas Dummes zu tun, alias rm="rm -i"haben Sie mehr Häute gerettet als alles andere da draußen, denke ich.
Matthew Scharley
832

Verwenden Sie den Befehl "Verknüpfung aufheben" und stellen Sie sicher , dass am Ende kein / steht

$ unlink mySymLink

unlink () löscht einen Namen aus dem Dateisystem. Wenn dieser Name der letzte Link zu einer Datei war und keine Prozesse die Datei geöffnet haben, wird die Datei gelöscht und der verwendete Speicherplatz zur Wiederverwendung bereitgestellt. Wenn der Name der letzte Link zu einer Datei war, aber bei allen Prozessen die Datei noch geöffnet ist, bleibt die Datei bestehen, bis der letzte Dateideskriptor, der darauf verweist, geschlossen wird.

Ich denke, das kann problematisch sein, wenn ich es richtig lese.

Wenn sich der Name auf einen symbolischen Link bezieht, wird der Link entfernt.

Wenn sich der Name auf einen Socket, ein FIFO oder ein Gerät bezieht, wird der Name entfernt, aber Prozesse, bei denen das Objekt geöffnet ist, können ihn weiterhin verwenden.

https://linux.die.net/man/2/unlink

Joe Phillips
quelle
33
@OmarAbid Die "rm foo /" Version macht mir Angst. Dieser scheint viel sicherer :)
Joe Phillips
9
In Ubuntu, ich getestet mit ~/c/a/file, /c/b/mit ln -s ~/c/a ~/c/b/. In ~/c/b/, rm a/funktioniert nicht, rm -rf a/leert nur das Original a. unlink afunktioniert perfekt und unlink a/macht nichts.
Brady Trainor
3
In OS X 10.10 unlinkist einfach ein Alias ​​für rm. Zeigt, dass rmbeim Umgang mit einem Teil Ihrer Verzeichnisstruktur die richtige Disziplin angewendet werden sollte.
Doug Powers
1
Bei der Skripterstellung rm -fwird ein Link stillschweigend gelöscht, unabhängig davon, ob er vorhanden ist oder nicht, während unlinkbei der Erstellung des Links ein Link beanstandet wird. Es gibt keine Option -f für das Aufheben der Verknüpfung, wodurch das Skript komplexer wird.
Shonky Linux Benutzer
22
unlinkkann reguläre Dateien löschen. Es ist weniger nützlich als rmund nicht spezifisch für Symlinks. rmlöscht auch keine Verzeichnisse ohne -rFlag. Ich empfehle daher, rm zu bevorzugen. Es hat Flags für ausführlich und interaktiv. sowie aussagekräftige Warn- und Fehlermeldungen.
ThorSummoner
18

rm sollte den symbolischen Link entfernen.

skrall@skrall-desktop:~$ mkdir bar
skrall@skrall-desktop:~$ ln -s bar foo
skrall@skrall-desktop:~$ ls -l foo
lrwxrwxrwx 1 skrall skrall 3 2008-10-16 16:22 foo -> bar
skrall@skrall-desktop:~$ rm foo
skrall@skrall-desktop:~$ ls -l foo
ls: cannot access foo: No such file or directory
skrall@skrall-desktop:~$ ls -l bar
total 0
skrall@skrall-desktop:~$ 
Steve K.
quelle
17

Verwenden Sie, rm symlinknameaber fügen Sie am Ende keinen Schrägstrich ein (verwenden Sie nicht :) rm symlinkname/. Sie werden dann gefragt, ob Sie den Symlink entfernen möchten, um ymit Ja zu antworten.

DeeEss09
quelle
63
Sie liegen nicht falsch, aber die richtige Antwort ist bereits hier und akzeptiert (vor 4 Jahren!). Warum die Mühe?
Matthew Scouten
1
Google hatte dies als vorgestellten Ausschnitt bei der Suche nach "Symlink entfernen". Vielleicht gefiel ihm die Kürze, nicht sicher, wie seine Heuristiken funktionieren. Wie auch immer, ich habe sofort einen Facepalm gemacht, als ich auf meine Kommandozeile zurückblickte :-)
Randall
12

Angenommen, es ist tatsächlich ein Symlink,

$ rm -d symlink

Es sollte es herausfinden, aber da es nicht möglich ist, können wir den latenten Code aktivieren, der für einen anderen Fall vorgesehen war, der nicht mehr existiert, aber hier zufällig das Richtige tut.

Joshua
quelle
7

Wenn rm einen Symlink nicht entfernen kann, müssen Sie möglicherweise die Berechtigungen für das Verzeichnis überprüfen, das den Symlink enthält. Um Verzeichniseinträge zu entfernen, benötigen Sie eine Schreibberechtigung für das enthaltende Verzeichnis.

Greg Hewgill
quelle
4

Angenommen, Ihr Setup ist ungefähr so: ln -s /mnt/bar ~/foodann sollten Sie in der Lage sein, dies rm fooohne Probleme zu tun . Wenn Sie dies nicht können, stellen Sie sicher, dass Sie der Eigentümer fooder Datei sind und über die Berechtigung zum Schreiben / Ausführen der Datei verfügen. Das Entfernen foowird nicht berührt bar, es sei denn, Sie tun es rekursiv.

TJ L.
quelle
2

Führen rm linknameSie unter CentOS einfach "Ausführen" aus und Sie werden gefragt, ob Sie den symbolischen Link entfernen möchten. Geben Sie Yund ein Enter, der Link wird entfernt und das Verzeichnis ist sicher.

Yuri
quelle
2

Ich hatte dieses Problem mit MinGW (eigentlich Git Bash), das auf einem Windows Server ausgeführt wurde. Keiner der oben genannten Vorschläge schien zu funktionieren. Am Ende wurde eine Kopie des Verzeichnisses erstellt, falls der Softlink im Windows Explorer gelöscht und das Element im Papierkorb gelöscht wurde. Es machte Geräusche, als würde es die Dateien löschen, tat es aber nicht. Machen Sie aber ein Backup!

Keith Whittingham
quelle
3
"Es machte Geräusche, als würde es Dateien löschen ..." - Wow!
Sterex
LMFAO. "Es machte Geräusche, als würde es Dateien löschen ..."
Shivam Jha
Ich erinnere mich an Disketten!
Keith Whittingham
Keine der oben genannten Funktionen hat bei mir funktioniert: eddyq @ eddyq-Latitude-E6440: ~ $ ls Desktop-Downloads Dropbox-Windows Musik Öffentliche Videos w Dokumente Dropbox examples.desktop Bilder Vorlagen 'VmWare vmx files'
eddyq