我已经使用“cp -as”复制了一个目录,现在我很害怕“rm -rf”创建的目录,因为它可能会删除原始目录

eff*_*iae 19 cp symlink rm

我已经复制了一个目录cp -as /media/user/dir symlinks,现在我很害怕,rm -rf symlinks因为它可能会删除其中的文件/media/user/dir

仅删除目录结构和符号链接symlinks 而不触及任何内容的安全方法是什么/media/user/dir

作为测试,我这样做了:

$ mkdir test
$ touch test/file
$ mkdir test/dir
$ touch test/dir/file2
$ cp -as test syms
$ rm -rf syms         
Run Code Online (Sandbox Code Playgroud)

此测试没有触及原始 test目录。这是一个完整的测试吗?总是这样吗?

我没有空间进行备份/media/user/dir

Kus*_*nda 28

您可以删除包含符号链接的目录,而不必担心这也会删除原始文件。

rm该实用程序的 POSIX 规范规定(关于遇到符号链接时会发生什么):

rm实用程序不得通过跟随符号链接进入层次结构的其他部分来遍历目录,而应删除链接本身。

然后,稍后(在基本原理部分):

根据描述,rm由于对功能的依赖,该实用程序会删除符号链接本身,而不是它们引用的文件。unlink()当使用-r或删除层次结构时-R,必须明确禁止遵循符号链接。

GNUrm手册对此没有任何说明,但我们必须假设它在这方面不会违反 POSIX。其他系统的手册有时明确包含此承诺。以下来自 OpenBSD(FreeBSD 和 NetBSD 具有相同的措辞):

rm实用程序删除符号链接,而不是链接引用的文件。

...以及来自 AIX(Solaris 有类似的措辞):

如果文件是符号链接,则该链接将被删除,但符号链接引用的文件或目录仍保留。

rm请注意,关于符号链接的行为可以在本地轻松测试:

$ touch file
$ ls -l
total 0
-rw-r--r--  1 myself  wheel  0 Feb 26 09:32 file
$ ln -s file link
$ ls -l link
lrwxr-xr-x  1 myself  wheel  4 Feb 26 09:32 link -> file
$ rm link
$ ls -l
total 0
-rw-r--r--  1 myself  wheel  0 Feb 26 09:32 file
Run Code Online (Sandbox Code Playgroud)

可以对目录中的符号链接进行类似的练习。

  • 老实说,*“当使用 -r 或 -R 删除层次结构时,必须明确禁止遵循符号链接。”* 听起来很可怕:没有 -r 的默认设置现在需要带有 -r 的显式选项,或者是什么?根本没有“--no-follow”选项一定意味着我误解了这句话,并且测试证实了这一点,但仍然如此。 (4认同)