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担心会遵循符号链接并删除该目录中的所有内容(这很糟糕)。

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


16
使用指向虚拟文件的符号链接创建虚拟目录并执行场景有多困难?然后,您将肯定知道它是如何工作的!

Answers:


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(拉伸)系统上完成的。


12
rm -rf baz / *将删除其中的内容
Wyrmwood 2014年

2
是的,如果执行rm -rf [symlink],则原始目录的内容将被删除!要非常小心。
Buttle Butkus

@frnknstn你是对的。我在最新的Debian系统上看到的行为与您提到的相同。我不记得我在哪个版本的Debian上进行了较早的实验。在较早版本的Debian上进行的较早实验中,第三个示例中的a.txt必须存在,或者我的实验中存在错误。我已经用在Debian 9上观察到的当前行为更新了答案,并且这种行为与您提到的一致。
苏珊·帕尔

19

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

我唯一要谨慎的是,如果您调用了类似“ rm -rf msg /”(后跟斜杠)的名称,请不要这样做,因为它会删除msg指向的目录,而不是msg符号链接本身。


3
“我唯一要谨慎的是,如果您调用了类似“ rm -rf msg /”之类的名称(后跟斜杠。)请不要这样做,因为它将删除味精指向的目录,而不是味精。符号链接本身。” -我认为这不是真的。请参阅下面我的回复中的第三个示例。

1
我得到与@Susam相同的结果('rm -r symlink /'不会删除symlink的目标),对此感到很高兴,因为这很容易犯错。
Andrew Crabb

5

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.