![我已经使用“cp -as”复制了一个目录,现在我很害怕“rm -rf”创建的目录,因为它可能会删除原始目录](https://linux22.com/image/202865/%E6%88%91%E5%B7%B2%E7%BB%8F%E4%BD%BF%E7%94%A8%E2%80%9Ccp%20-as%E2%80%9D%E5%A4%8D%E5%88%B6%E4%BA%86%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95%EF%BC%8C%E7%8E%B0%E5%9C%A8%E6%88%91%E5%BE%88%E5%AE%B3%E6%80%95%E2%80%9Crm%20-rf%E2%80%9D%E5%88%9B%E5%BB%BA%E7%9A%84%E7%9B%AE%E5%BD%95%EF%BC%8C%E5%9B%A0%E4%B8%BA%E5%AE%83%E5%8F%AF%E8%83%BD%E4%BC%9A%E5%88%A0%E9%99%A4%E5%8E%9F%E5%A7%8B%E7%9B%AE%E5%BD%95.png)
我已经复制了一个目录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
此测试没有触及原始 test
目录。这是一个完整的测试吗?总是这样吗?
我没有空间进行备份/media/user/dir
答案1
您可以删除包含符号链接的目录,而不必担心这也会删除原始文件。
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
可以对目录中的符号链接进行类似的练习。
答案2
以下是获得对删除过程信心的方法:
创建一个测试设置(例如 ./Delete_test/),其中包含目录、符号链接和常规文件。
然后 CD 到该测试设置。
现在运行strace rm -rf ./* 2> /tmp/strace.rm
并捕获输出。
/tmp/strace.rm
使用vim
or检查grep
并查找 fstat 和 unlink 等字符串;它应该显示类似fstatat
和 的系统调用unlinkat
;您还应该看到AT_SYMLINK_NOFOLLOW
& AT_FDCWD
。这意味着“不要遵循符号链接”和“使用 CWD”;这应该让您知道,在符号链接的情况下,原始目录和文件不会参与删除过程并且是安全的。
一些参考资料:
https://linux.die.net/man/2/unlink
https://linux.die.net/man/2/unlinkat
https://linux.die.net/man/2/fstat
https://linux.die.net/man/2/fstatat