NTFS 支持各种链接,包括联结、硬链接、软链接等。所以这里有一个问题。
假设您正在递归删除一个实际包含上述内容的目录。很容易想象,您的应用程序,无论是什么,都不是删除所有的联结、可能导致您感兴趣的目录之外的软链接等,而是遍历它们并首先删除其中的所有文件。
这很容易导致重大数据丢失。
这是一个简单的例子。您安装了具有另一个 Windows 安装的硬盘驱动器。
让我们检查一下内容D:\ProgramData
:
D:\ProgramData>dir /a
Volume in drive D has no label.
Volume Serial Number is 1234-4321
Directory of D:\ProgramData
12/06/2021 12:56 PM <DIR> .
12/06/2021 12:56 PM <DIR> ..
07/14/2009 10:08 AM <JUNCTION> Application Data [C:\ProgramData]
07/14/2009 10:08 AM <JUNCTION> Desktop [C:\Users\Public\Desktop]
07/14/2009 10:08 AM <JUNCTION> Documents [C:\Users\Public\Documents]
07/14/2009 10:08 AM <JUNCTION> Favorites [C:\Users\Public\Favorites]
02/11/2016 03:51 PM <DIR> Microsoft
07/10/2019 03:00 AM <DIR> Microsoft Help
12/23/2019 04:04 PM <DIR> Package Cache
07/14/2009 10:08 AM <JUNCTION> Start Menu [C:\ProgramData\Microsoft\Windows\Start Menu]
07/14/2009 10:08 AM <JUNCTION> Templates [C:\ProgramData\Microsoft\Windows\Templates]
现在,如果您尝试递归删除D:\ProgramData
怎么办?我什至不会尝试这样做,因为我担心C:\ProgramData
会先被删除。
在 Linuxrm -rf
中完美地处理了这个 - 它看到符号链接(到目录)并将符号链接作为文件删除,而不试图遍历它们。
在 Windows 中递归删除此类目录的安全方法是什么?
rmdir /q /s
? 还有什么?
rmdir 将删除符号链接。
del 将删除链接目标,但不会删除链接。
rmdir /S /Q
将递归删除目录并且不会遵循符号链接。我已经在 Windows 10 中测试并确认了 cmd 的行为:
根据此评论,如果从 powershell 调用 rmdir 与从 cmd 调用,rmdir 的行为会有所不同,但是我没有使用 powershell 对其进行测试。
要删除所有不是联结的文件,这个命令应该这样做:
在哪里:
/s
: 递归/a:-l
: 只有不是重解析点的文件NTFS 重解析点 包括目录连接、符号链接和卷安装点。
可以使用以下命令对将要删除的内容进行小测试:
(如果它很重要,我仍然会备份该文件夹。)
从命令提示符尝试使用 rmdir /s
我创建了一个目录 c:\abc1,其中包含一个文本文件。
我创建了一个目录 c:\test1 和一个子目录 c:\test1\blah
在 c:\test1\blah 我尝试创建指向 c:\abc1 的链接、符号链接或联结链接..
然后当我在 blah 上执行 rmdir /s 时,我检查了 c:\abc1 并且它的内容仍然存在。
因此,在 Windows 7 中测试的 cmd 提示符下的 rmdir /s 是安全的。
真的,您应该能够非常轻松地自己进行测试。
一条评论提到 powershell rmdir 是不同的。我不能对 powershell 发表太多评论,我不怎么使用它。我看到 powershell 的 rmdir 确实给出了不同的输出,例如 rmdir 说“命令管道中的 cmdlet Remove-Item ...”所以似乎与 cmd 非常不同,我不熟悉它。