Чи 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за символьним посиланням та видалить усе, що в цьому каталозі (що дуже погано).

Я нічого не можу знайти про це на сторінках man. Якою буде точна поведінка запуску rm -rfз каталогу над цим?


16
Наскільки важко створити фіктивний реж із символьним посиланням, що вказує на фіктивний файл та виконати сценарій? Тоді ви точно знатимете, як це працює!

Відповіді:


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], то вміст вихідного каталогу буде видалено! Будьте дуже обережні.
Buttle Butkus

@frnknstn Ви праві. Я бачу ту саму поведінку, яку ви згадуєте в моїй останній системі Debian. Я не пам'ятаю, за якою версією Debian я проводив попередні експерименти. У моїх попередніх експериментах на більш старій версії Debian будь-який a.txt повинен був зберегтися в третьому прикладі, або я, мабуть, помилився в експерименті. Я оновив відповідь поточною поведінкою, яку я спостерігаю на Debian 9, і така поведінка відповідає тому, що ви згадуєте.
Сусам Пал

19

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

Єдине, до чого я б застерігся, це було б, якби ви назвали щось на кшталт "rm -rf msg /" (з останньою косою рисою.) Не робіть цього, тому що він видалить каталог, на який вказує msg, а не msg symlink себе.


3
"Єдине, до чого я б застерігся, це було б, якби ви назвали щось на кшталт" rm -rf msg / "(з останньою косою рисою.) Не робіть цього, тому що він видалить каталог, на який вказує msg, а не msg симпосилання себе ". - Я не вважаю це правдою. Дивіться третій приклад у моїй відповіді нижче.

1
Я отримую той самий результат, що і @Susam ('rm -r symlink /' не видаляє ціль symlink), що мені приємно, оскільки це було б дуже легкою помилкою.
Ендрю Крабб

5

rmповинні видалити файли та каталоги. Якщо файл є символічним посиланням, посилання видаляється, а не ціль. Він не інтерпретуватиме символічне посилання. Наприклад, якою має бути поведінка під час видалення 'зламаних посилань' - rm виходить з 0, а не з нулем, щоб вказати на збій

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.