Czy rm -rf podąża za dowiązaniami symbolicznymi?

72

Mam taki katalog:

$ 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

I chcę go usunąć za pomocą rm -r.

Jednak boję się, rm -rże podąży za dowiązaniem symbolicznym i usunie wszystko z tego katalogu (co jest bardzo złe).

Nie mogę nic na ten temat znaleźć na stronach podręcznika. Jakie byłoby dokładne działanie rm -rfz katalogu powyżej tego?

Greg
źródło
16
Jak trudno jest stworzyć fikcyjny katalog z dowiązaniem symbolicznym wskazującym na plik fikcyjny i wykonać scenariusz? Wtedy na pewno będziesz wiedzieć, jak to działa!

Odpowiedzi:

57

Przykład 1: Usuwanie katalogu zawierającego miękkie łącze do innego katalogu.

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$

Widzimy więc, że cel soft-link przetrwał.

Przykład 2: Usuwanie miękkiego linku do katalogu

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$

Tylko miękki link jest usuwany. Cel soft-link przetrwa.

Przykład 3: Próba usunięcia celu miękkiego łącza

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

Plik docelowy dowiązania symbolicznego nie zachowuje się.

Powyższe eksperymenty przeprowadzono na systemie Debian GNU / Linux 9.0 (stretch).

Susam Pal
źródło
12
rm -rf baz / * usunie zawartość
Wyrmwood
2
Tak, jeśli zrobisz rm -rf [dowiązanie symboliczne], wówczas zawartość oryginalnego katalogu zostanie zatarta! Bądź bardzo ostrożny.
Buttle Butkus
@frnknstn Masz rację. Widzę to samo zachowanie, o którym wspomniałeś w moim najnowszym systemie Debian. Nie pamiętam, na której wersji Debiana przeprowadziłem wcześniejsze eksperymenty. W moich wcześniejszych eksperymentach na starszej wersji Debiana albo a.txt musiał przetrwać w trzecim przykładzie, albo musiałem popełnić błąd w moim eksperymencie. Zaktualizowałem odpowiedź z obecnym zachowaniem, które obserwuję na Debianie 9 i to zachowanie jest zgodne z tym, o czym wspomniałeś.
Susam Pal
19

Twój katalog / home / me / msg będzie bezpieczny, jeśli rm -rf katalog, z którego uruchomiłeś ls. Tylko symboliczne łącze zostanie usunięte, a nie katalog, na który wskazuje.

Jedyną rzeczą, na którą chciałbym zachować ostrożność, byłoby wywołanie czegoś takiego jak „rm -rf msg /” (z ukośnikiem końcowym). Nie rób tego, ponieważ spowoduje to usunięcie katalogu, na który wskazuje msg, zamiast dowiązania symbolicznego msg samo.

Ken Simon
źródło
3
„Jedyną rzeczą, na którą byłbym ostrożny, byłoby, gdybyś nazwał coś w stylu„ rm -rf msg / ”(z końcowym ukośnikiem.) Nie rób tego, ponieważ spowoduje to usunięcie katalogu, na który wskazuje msg, zamiast msg sam link symboliczny ”. - Nie uważam tego za prawdę. Zobacz trzeci przykład w mojej odpowiedzi poniżej.
1
Otrzymuję taki sam wynik jak @Susam ('rm -r symlink /' nie usuwa celu dowiązania symbolicznego), co mnie cieszy, ponieważ byłby to bardzo łatwy błąd.
Andrew Crabb
5

rmpowinien usunąć pliki i katalogi. Jeśli plik jest dowiązaniem symbolicznym, link jest usuwany, a nie cel. Nie zinterpretuje dowiązania symbolicznego. Na przykład, jakie powinno być zachowanie podczas usuwania „zepsutych linków” - rm kończy się z 0 nie z niezerowym, co oznacza błąd

Jayan
źródło