我已经复制了一个目录,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
您可以删除包含符号链接的目录,而不必担心这也会删除原始文件。
该
rm
实用程序的 POSIX 规范说(关于遇到符号链接时会发生什么):然后,稍后(在基本原理部分):
GNU
rm
手册对此没有任何说明,但我们必须假设它在这方面与 POSIX 没有冲突。其他系统上的手册有时会明确包含此承诺。以下来自 OpenBSD(FreeBSD 和 NetBSD 有相同的措辞):...并来自 AIX(Solaris 有类似的措辞):
请注意,
rm
关于符号链接的行为可以在本地轻松测试:可以对目录中的符号链接进行类似的练习。
这是获得对删除过程的信心的一种方法:
创建一个包含目录、符号链接和常规文件的测试设置(例如 ./Delete_test/)。
然后 CD 到该测试设置。
现在运行
strace rm -rf ./* 2> /tmp/strace.rm
并捕获输出。检查or
/tmp/strace.rm
并查找 fstat 和 unlink 等字符串;它应该显示对类似和的系统调用;您还应该看到& 。这意味着“不要遵循符号链接”和“使用 CWD”;这应该让您知道,在符号链接的情况下,原始目录和文件不会参与删除过程并且是安全的。vim
grep
fstatat
unlinkat
AT_SYMLINK_NOFOLLOW
AT_FDCWD
一些参考资料:
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