Rm -rf segue collegamenti simbolici?


72

Ho una directory come questa:

$ 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

E voglio rimuoverlo usando rm -r.

Tuttavia ho paura rm -rseguirà il link simbolico ed eliminerà tutto in quella directory (che è molto male).

Non riesco a trovare nulla al riguardo nelle pagine man. Quale sarebbe il comportamento esatto dell'esecuzione rm -rfda una directory sopra questa?


16
Quanto è difficile creare una directory fittizia con un collegamento simbolico che punta a un file fittizio ed eseguire lo scenario? Allora saprai per certo come funziona!


@LordDoskias Sono personalmente abbastanza contento che io e le 46mila persone che abbiamo visitato la pagina siamo stati in grado di leggere semplicemente il risultato senza sperimentare se stessi. E, avrebbero potuto evitare un brutto disastro avendo i loro esperimenti riusciti e poi facendo accidentalmente rm -rf somesymlink/, il che è distruttivo con il trailing /. Se il 5% dei lettori avesse sperimentato e un simile esperimento impiegasse 2,5 minuti, ovvero 5700 minuti, o 95 ore, o un contributo di $ 6000 alla società a $ 60 / ora. Penso che a tutti piace SO così com'è, facciamo tutti e rispondiamo alle domande insieme: 3
Nicholas Pipitone,

Risposte:


57

Esempio 1: eliminazione di una directory contenente un collegamento software a un'altra directory.

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$

Quindi, vediamo che il bersaglio del soft-link sopravvive.

Esempio 2: eliminazione di un collegamento software a una directory

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$

Solo, il collegamento software viene eliminato. Il bersaglio del soft-link sopravvive.

Esempio 3: tentativo di eliminare la destinazione di un soft-link

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

Il file nella destinazione del collegamento simbolico non sopravvive.

Gli esperimenti di cui sopra sono stati condotti su un sistema Debian GNU / Linux 9.0 (stretch).


12
rm -rf baz / * rimuoverà il contenuto
Wyrmwood,

2
Sì, se si fa rm -rf [symlink], il contenuto della directory originale verrà cancellato! Essere molto attenti.
Buttle Butkus,

@frnknstn Hai ragione. Vedo lo stesso comportamento che menzioni sul mio ultimo sistema Debian. Non ricordo su quale versione di Debian ho eseguito gli esperimenti precedenti. Nei miei precedenti esperimenti su una versione precedente di Debian, o a.txt deve essere sopravvissuto nel terzo esempio o devo aver fatto un errore nel mio esperimento. Ho aggiornato la risposta con l'attuale comportamento che osservo su Debian 9 e questo comportamento è coerente con ciò che menzioni.
Susam Pal,

19

La tua directory / home / me / msg sarà sicura se rm -rf la directory da cui hai eseguito ls. Verrà rimosso solo il collegamento simbolico stesso, non la directory a cui punta.

L'unica cosa di cui sarei cauto, sarebbe se tu chiamassi qualcosa come "rm -rf msg /" (con la barra finale). Non farlo perché rimuoverà la directory a cui punta msg, piuttosto che il link simbolico di msg si.


3
"L'unica cosa di cui sarei cauto, sarebbe se tu chiamassi qualcosa come" rm -rf msg / "(con la barra finale.) Non farlo perché rimuoverà la directory a cui punta msg, piuttosto che il msg symlink stesso ". - Non trovo che questo sia vero. Vedi il terzo esempio nella mia risposta di seguito.

1
Ottengo lo stesso risultato di @Susam ('rm -r symlink /' non cancella la destinazione di symlink), cosa che mi fa piacere perché sarebbe un errore molto facile da fare.
idoimaging del

5

rmdovrebbe rimuovere file e directory. Se il file è un collegamento simbolico, il collegamento viene rimosso, non la destinazione. Non interpreterà un collegamento simbolico. Ad esempio, quale dovrebbe essere il comportamento quando si eliminano "collegamenti interrotti": rm esce con 0 e non con zero per indicare l'errore

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.