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 退出,而不是以非零退出以表示失败

相关内容