У меня есть такой каталог:
$ 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
что перейду по символической ссылке и удалю все в этом каталоге (что очень плохо).
Я не могу найти ничего об этом в man-страницах. Каково будет точное поведение при запуске rm -rf
из каталога, находящегося выше этого?
решение1
Пример 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).
решение2
Ваш каталог /home/me/msg будет в безопасности, если вы выполните rm -rf каталог, из которого вы запустили ls. Будет удалена только сама символическая ссылка, а не каталог, на который она указывает.
Единственное, чего я хотел бы остерегаться, так это вызова чего-то вроде «rm -rf msg/» (с завершающим слешем). Не делайте этого, поскольку это удалит каталог, на который указывает msg, а не саму символическую ссылку msg.
решение3
rm
следует удалить файлы и каталоги. Если файл является символической ссылкой, удаляется ссылка, а не цель. Он не будет интерпретировать символическую ссылку. Например, каким должно быть поведение при удалении «сломанных ссылок» — rm завершается с 0, а не с ненулевым значением, чтобы указать на сбой