rm -rf 是否遵循符號連結?

rm -rf 是否遵循符號連結?

我有一個這樣的目錄:

$ 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從該目錄之上的目錄運行的確切行為是什麼?

答案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

如果您 rm -rf 執行 ls 的目錄,您的 /home/me/msg 目錄將是安全的。僅符號連結本身將被刪除,而不是它指向的目錄。

我唯一要小心的是,如果您調用類似“rm -rf msg/”(帶有尾部斜杠)的內容,請不要這樣做,因為它將刪除 msg 指向的目錄,而不是 msg 符號鏈接本身。

答案3

rm應該刪除檔案和目錄。如果檔案是符號鏈接,則刪除鏈接,而不是目標。它不會解釋符號連結。例如,刪除「損壞的連結」時應該採取什麼行為 - rm 以 0 退出,而不是以非零退出來指示失敗

相關內容