Rm -rf следует по символическим ссылкам?

72

У меня есть такой каталог:

$ 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

И я хочу удалить его, используя rm -r.

Однако я боюсь, что rm -rбуду следовать символической ссылке и удалять все в этом каталоге (что очень плохо).

Я не могу найти ничего об этом на страницах руководства. Каково будет точное поведение при запуске rm -rfиз каталога выше этого?

Greg
источник
16
Насколько сложно создать фиктивный каталог с символической ссылкой, указывающей на фиктивный файл, и выполнить сценарий? Тогда вы точно будете знать, как это работает!
@LordDoskias Я лично очень рад, что я и 46 тысяч человек, которые посетили страницу, смогли просто прочитать результат, не экспериментируя самостоятельно. И они могли бы избежать ужасной катастрофы, если бы их эксперименты увенчались успехом, а затем случайно сделали rm -rf somesymlink/, что губительно для отставания /. Если бы 5% читателей экспериментировали, и такой эксперимент занимает 2,5 минуты, это 5700 минут, или 95 часов, или вклад в 6000 долларов для общества при 60 долларов в час. Я думаю, что нам всем нравится ТАК, как это, давайте все зададим и ответим на вопросы вместе: 3
Николас Пипитоне

Ответы:

57

Пример 1. Удаление каталога, содержащего программную ссылку на другой каталог.

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$

Итак, мы видим, что цель мягкой ссылки выживает.

Пример 2: удаление мягкой ссылки на каталог

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$

Только софт-ссылка удаляется. Цель софт-линка выживает.

Пример 3: Попытка удалить цель софт-ссылки

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

Файл в целевой символической ссылке не сохраняется.

Вышеуказанные эксперименты проводились в системе Debian GNU / Linux 9.0 (stretch).

Сусам Пал
источник
12
rm -rf baz / * удалит содержимое
Wyrmwood
2
Да, если вы выполните команду rm -rf [symlink], то содержимое исходного каталога будет уничтожено! Будь очень осторожен.
Баттл Буткус
@frnknstn Вы правы. Я вижу то же поведение, которое вы упоминаете в моей последней системе Debian. Я не помню, на какой версии Debian я проводил предыдущие эксперименты. В моих предыдущих экспериментах над более старой версией Debian либо a.txt должен был выжить в третьем примере, либо я допустил ошибку в своем эксперименте. Я обновил ответ с учетом текущего поведения, которое я наблюдаю в Debian 9, и это поведение согласуется с тем, что вы упоминаете.
Susam Pal
19

Ваш каталог / home / me / msg будет в безопасности, если вы запустите rm -rf каталог, из которого вы запустили ls. Будет удалена только сама символическая ссылка, а не каталог, на который она указывает.

Единственное, к чему я должен быть осторожен, это если бы вы назвали что-то вроде «rm -rf msg /» (с завершающей косой чертой.) Не делайте этого, потому что это удалит каталог, на который указывает msg, а не символьную ссылку msg. сам.

Кен Саймон
источник
3
«Единственное, к чему я был бы осторожен, это если бы вы назвали что-то вроде« rm -rf msg / »(с завершающей косой чертой.) Не делайте этого, потому что это удалит каталог, на который указывает msg, а не msg Сама ссылка. " - Я не считаю это правдой. Смотри третий пример в моем ответе ниже.
1
Я получаю тот же результат, что и @Susam («rm -r symlink /» не удаляет цель символической ссылки), и я рад, что это будет очень легко сделать ошибку.
idoimaging
5

rmследует удалить файлы и каталоги. Если файл является символической ссылкой, ссылка удаляется, а не цель. Он не будет интерпретировать символическую ссылку. Например, каким должно быть поведение при удалении «неработающих ссылок», при этом происходит выход с 0, а не с ненулевым, что указывает на сбой

Джаян
источник