rm -rf 是否遵循符号链接?

Gre*_*reg 84 linux unix bash symbolic-link rm

我有一个这样的目录:

$ 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
Run Code Online (Sandbox Code Playgroud)

我想使用rm -r.

但是我害怕rm -r会遵循符号链接并删除该目录中的所有内容(这非常糟糕)。

我在手册页中找不到任何关于此的内容。rm -rf从上面的目录运行的确切行为是什么?

Sus*_*Pal 68

示例 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$
Run Code Online (Sandbox Code Playgroud)

所以,我们看到软链接的目标仍然存在。

示例 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$
Run Code Online (Sandbox Code Playgroud)

只是,软链接被删除。软链接的目标存活。

示例 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
Run Code Online (Sandbox Code Playgroud)

符号链接目标中的文件不存在。

上述实验是在 Debian GNU/Linux 9.0 (stretch) 系统上完成的。

  • rm -rf baz/* 将删除内容 (16认同)
  • 是的,如果你执行 rm -rf [symlink],那么原始目录的内容将被抹去!要非常小心。 (3认同)

小智 21

如果您 rm -rf 运行 ls 的目录,您的 /home/me/msg 目录将是安全的。只会删除符号链接本身,而不是它指向的目录。

我唯一要小心的是,如果你调用类似“rm -rf msg/”(带有斜杠)之类的东西。不要这样做,因为它会删除 msg 指向的目录,而不是 msg 符号链接本身。

  • “我唯一要小心的是,如果你调用类似“rm -rf msg/”(带有斜杠)之类的东西。不要这样做,因为它会删除 msg 指向的目录,而不是 msg符号链接本身。” - 我不认为这是真的。请参阅下面我的回复中的第三个示例。 (3认同)

Jay*_*yan 5

rm应该删除文件和目录。如果文件是符号链接,则删除链接,而不是目标。它不会解释符号链接。例如,删除“断开的链接”时应该是什么行为 - rm 以 0 而非非零退出以表示失败