Folgt rm -rf symbolischen Links?

72

Ich habe ein Verzeichnis wie dieses:

$ ls -l
total 899166
drwxr-xr-x 12 me scicomp       324 Jan 24 13:47 data
-rw-r--r--  1 me scicomp     84188 Jan 24 13:47 lod-thin-1.000000-0.010000-0.030000.rda
drwxr-xr-x  2 me scicomp       808 Jan 24 13:47 log
lrwxrwxrwx  1 me scicomp        17 Jan 25 09:41 msg -> /home/me/msg

Und ich möchte es mit entfernen rm -r.

Ich habe jedoch Angst rm -r, dem Symlink zu folgen und alles in diesem Verzeichnis zu löschen (was sehr schlecht ist).

Ich kann nichts dazu in den Manpages finden. Wie würde es sich genau verhalten, rm -rfvon einem Verzeichnis oberhalb dieses Verzeichnisses aus zu starten?

Greg
quelle
16
Wie schwierig ist es, ein Dummy-Verzeichnis mit einem Symlink zu erstellen, der auf eine Dummy-Datei verweist, und das Szenario auszuführen? Dann wissen Sie genau, wie es funktioniert!

Antworten:

57

Beispiel 1: Löschen eines Verzeichnisses mit einem Softlink zu einem anderen Verzeichnis.

susam@nifty:~/so$ mkdir foo bar
susam@nifty:~/so$ touch bar/a.txt
susam@nifty:~/so$ ln -s /home/susam/so/bar/ foo/baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── foo
    └── baz -> /home/susam/so/bar/

3 directories, 1 file
susam@nifty:~/so$ rm -r foo
susam@nifty:~/so$ tree
.
└── bar
    └── a.txt

1 directory, 1 file
susam@nifty:~/so$

Wir sehen also, dass das Ziel des Softlinks überlebt.

Beispiel 2: Löschen eines Softlinks zu einem Verzeichnis

susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── baz -> /home/susam/so/bar

2 directories, 1 file
susam@nifty:~/so$ rm -r baz
susam@nifty:~/so$ tree
.
└── bar
    └── a.txt

1 directory, 1 file
susam@nifty:~/so$

Nur der Softlink wird gelöscht. Das Ziel des Softlinks überlebt.

Beispiel 3: Versuch, das Ziel eines Softlinks zu löschen

susam@nifty:~/so$ ln -s /home/susam/so/bar baz
susam@nifty:~/so$ tree
.
├── bar
   └── a.txt
└── baz -> /home/susam/so/bar

2 directories, 1 file
susam@nifty:~/so$ rm -r baz/
rm: cannot remove 'baz/': Not a directory
susam@nifty:~/so$ tree
.
├── bar
└── baz -> /home/susam/so/bar

2 directories, 0 files

Die Datei im Ziel des symbolischen Links überlebt nicht.

Die obigen Experimente wurden auf einem Debian GNU / Linux 9.0 (Stretch) -System durchgeführt.

Susam Pal
quelle
12
rm -rf baz / * wird den Inhalt entfernen
Wyrmwood
2
Ja, wenn Sie rm -rf [symlink] ausführen, wird der Inhalt des ursprünglichen Verzeichnisses gelöscht! Sei sehr vorsichtig.
Buttle Butkus
@frnknstn Du hast recht. Ich sehe dasselbe Verhalten, das Sie auf meinem neuesten Debian-System erwähnt haben. Ich kann mich nicht erinnern, auf welcher Debian-Version ich die früheren Experimente durchgeführt habe. In meinen früheren Experimenten mit einer älteren Version von Debian muss entweder a.txt im dritten Beispiel überlebt haben oder ich muss einen Fehler in meinem Experiment gemacht haben. Ich habe die Antwort mit dem aktuellen Verhalten aktualisiert, das ich unter Debian 9 beobachte, und dieses Verhalten stimmt mit dem überein, was Sie erwähnt haben.
Susam Pal
19

Ihr / home / me / msg-Verzeichnis ist sicher, wenn Sie das Verzeichnis rm -rf angeben, von dem aus Sie ls ausgeführt haben. Es wird nur der Symlink selbst entfernt, nicht das Verzeichnis, auf das er verweist.

Ich wäre nur vorsichtig, wenn Sie so etwas wie "rm -rf msg /" (mit dem abschließenden Schrägstrich) aufrufen würden. Tun Sie dies nicht, da dadurch das Verzeichnis entfernt wird, auf das msg zeigt, und nicht der msg-Symlink selbst.

Ken Simon
quelle
3
Msgstr "" "Das einzige, auf das ich aufpassen würde, wäre, wenn Sie so etwas wie" rm -rf msg / "(mit dem abschließenden Schrägstrich) aufrufen. Tun Sie das nicht, weil dadurch das Verzeichnis entfernt wird, auf das msg zeigt, und nicht die msg symlink selbst. " - Ich finde das nicht wahr. Siehe das dritte Beispiel in meiner Antwort unten.
1
Ich erhalte dasselbe Ergebnis wie bei @Susam ('rm -r symlink /' löscht nicht das Ziel von symlink), worüber ich mich freue, da es ein sehr einfacher Fehler wäre.
Andrew Crabb
5

rmsollte Dateien und Verzeichnisse entfernen. Wenn es sich bei der Datei um eine symbolische Verknüpfung handelt, wird die Verknüpfung entfernt, nicht das Ziel. Es wird kein symbolischer Link interpretiert. Zum Beispiel, was sollte das Verhalten sein, wenn 'broken links'-Exits mit 0 und nicht mit ungleich Null gelöscht werden, um einen Fehler anzuzeigen

Jayan
quelle