web-dev-qa-db-fra.com

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

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 que rm -r suive le lien symbolique et supprime 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 de rm -rf à partir d'un répertoire situé au-dessus de celui-ci?

67
Greg

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 vers 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 d'effacement 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).

57
Susam Pal

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 symlink msg lui-même.

19
Ken Simon

rm devrait 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

5
Jayan