Est-ce que rm -rf suit des liens symboliques?

72

J'ai un répertoire comme celui-ci:

$ 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

Et je veux l'enlever en utilisant rm -r.

Cependant, j'ai peur de rm -rsuivre le lien symbolique et de supprimer tout ce qui se trouve dans ce répertoire (ce qui est très mauvais).

Je ne trouve rien à ce sujet dans les pages de manuel. Quel serait le comportement exact de l'exécution à rm -rfpartir d'un répertoire situé au-dessus de celui-ci?

Greg
la source
16
Combien il est difficile de créer un répertoire factice avec un lien symbolique pointant vers un fichier factice et d'exécuter le scénario? Ensuite, vous saurez avec certitude comment cela fonctionne!
@ LordDoskias Je suis personnellement très heureux que moi et les 46 000 personnes qui ont visité la page puissions simplement lire le résultat sans faire d'expérimentation. Et ils auraient peut-être pu éviter un sinistre désastre en faisant réussir leurs expériences puis en les faisant accidentellement rm -rf somesymlink/, ce qui est destructif pour le trailing /. Si 5% des lecteurs l'aient expérimenté et qu'une telle expérience prend 2,5 minutes, cela correspond à 5 700 minutes, soit 95 heures, ou une contribution de 6 000 $ à la société à 60 $ / heure. Je pense que nous aimons tous, donc comment c'est, posons et répondons ensemble aux questions: 3
Nicholas Pipitone

Réponses:

57

Exemple 1: Suppression d’un répertoire contenant un lien symbolique vers un autre répertoire.

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$

Nous voyons donc que la cible du lien virtuel survit.

Exemple 2: Suppression d'un lien symbolique dans un répertoire

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$

Seulement, le lien symbolique est supprimé. La cible du lien virtuel survit.

Exemple 3: tentative de suppression de la cible d'un lien symbolique

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

Le fichier dans la cible du lien symbolique ne survit pas.

Les expériences ci-dessus ont été effectuées sur un système Debian GNU / Linux 9.0 (stretch).

Susam Pal
la source
12
rm -rf baz / * retirera le contenu
Wyrmwood
2
Oui, si vous faites rm -rf [lien symbolique], le contenu du répertoire d'origine sera effacé! Soyez très prudent.
Buttle Butkus
@frnknstn Vous avez raison. Je vois le même comportement que vous mentionnez sur mon dernier système Debian. Je ne me souviens plus sur quelle version de Debian j'ai effectué les expériences précédentes. Dans mes expériences précédentes sur une version antérieure de Debian, soit le fichier a.txt devait avoir survécu dans le troisième exemple, soit j'avais commis une erreur dans mon expérience. J'ai mis à jour la réponse avec le comportement actuel que j'observe sous Debian 9 et ce comportement est cohérent avec ce que vous avez mentionné.
Susam Pal
19

Votre répertoire / home / me / msg sera en sécurité si vous rm -rf le répertoire à partir duquel vous avez exécuté ls. Seul le lien symbolique lui-même sera supprimé, pas le répertoire vers lequel il pointe.

La seule chose dont je me méfierais serait si vous appeliez quelque chose comme "rm -rf msg /" (avec la barre oblique finale). Ne le faites pas car cela supprimera le répertoire vers lequel msg pointe, plutôt que le lien symbolique msg lui-même.

Ken Simon
la source
3
"La seule chose dont je me méfierais serait si vous appeliez quelque chose comme" rm -rf msg / "(avec la barre oblique finale). Ne le faites pas car cela supprimera le répertoire vers lequel msg pointe, plutôt que le msg lien symbolique lui-même. " - Je ne trouve pas ça vrai. Voir le troisième exemple dans ma réponse ci-dessous.
1
J'obtiens le même résultat que @Susam ('rm -r symlink /' ne supprime pas la cible de symlink), ce qui me fait plaisir car ce serait une erreur très facile à commettre.
Idoimaging
5

rmdevrait supprimer les fichiers et les répertoires. Si le fichier est un lien symbolique, le lien est supprimé et non la cible. Cela n'interprétera pas un lien symbolique. Par exemple, quel devrait être le comportement lors de la suppression de 'liens rompus' - la sortie de la mémoire ferme avec 0 et non différente de zéro pour indiquer un échec

Jayan
la source