在Windows中大量删除文件
我有一个目录,在Windows 2008服务器上的某些子目录中包含约300万个文件。通过SHIFT+DEL在根目录上手动删除文件需要很长时间。有没有其他方法可以用**快的方式进行删除?
我有一个目录,在Windows 2008服务器上的某些子目录中包含约300万个文件。通过SHIFT+DEL在根目录上手动删除文件需要很长时间。有没有其他方法可以用**快的方式进行删除?
警告: 如果你有指向目录的符号链接,那么del
将删除实际的目录而不是符号链接。要非常小心,不要运行这些命令,除非你知道目标目录内没有符号链接。
我经常需要从WinXP加密驱动器中删除大量文件和目录,通常是在45,000个文件夹中删除约22 GB的50万个文件。
用Windows资源管理器删除是垃圾,因为它浪费了大量的时间来列举文件。我通常会把需要删除的东西移到C:\stufftodelete,并有一个deletestuff.bat批处理文件到rmdir /s/q C:\stufftodelete
。这个文件被安排在晚上运行,但有时我需要在白天运行,所以越快越好。
下面是对303个文件夹中960个文件的5.85 MB小样本进行快速时间测试的结果。我先运行了方法1,然后是方法2,再重新设置测试目录。
方法1一次就删除了文件和目录结构。
rmdir /s/q foldername
方法2的第一遍是删除文件,然后输出为nul,以避免为每一个单独的文件向屏幕写入的开销。第二遍则是清理剩余的目录结构。
del /f/s/q foldername > nul
rmdir /s/q foldername
下面是另一个测试的结果,使用404 MB,3243个文件夹中的19,521个文件。
2分33秒
所以这里面的内容并不多,可能是太接近了,单次测试无法判断。
编辑:我用更多的数据重新测试了一下,这是我的一个典型案例:28.3 GB的1,159,211个文件,146,918个文件夹。
-方法一: 2小时15分钟,2小时34分钟:平均:
如果你必须经常删除大的目录树,可以考虑将该目录树的根部存储在一个单独的分区上,然后在你需要删除所有东西的时候简单地快速格式化它。如果你需要自动完成这项工作,你可以使用这个DOS命令。
echo Y | format Z: /FS:NTFS /X /Q
其中Z: 是你的 “不稳定 "分区。注意:该分区必须没有标签。我在博客上写过这个问题 这里 。
除了快速复制/移动文件(使用它自己的API),TeraCopy可以删除文件,而且速度非常快。自从发现了TeraCopy,我不会在没有安装它的情况下使用电脑(如果我要复制/移动/删除)。
同样的安装程序安装x64版,但要使用它你必须手动强制安装。
比起稳定版,我更推荐测试版。 http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/
我做了一个蝙蝠文件,做同样的事情。
@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T
它的工作分为两步,第一步,它尝试删除文件。第二步是尝试获取文件的所有权。y应该根据你的本地情况进行修改(在英语中代表yes)。如果任务失败了(例如,如果因为权限问题失败了),那么你必须重新运行它。不过,第二轮不会尝试删除第一轮删除的文件,所以可能会很快。
使用方法。以delfolder.bat的形式保存在路径路径中(例如c:\windows),然后以
delfolder "foldername"
的形式运行,其中foldername是文件夹的名称
在我的测试中,删除123'000个文件用了3分钟(sata 7200rpm)。YAY!
最好的实际解决方案可能是将文件夹移出某个地方(如回收站),然后开始删除它。这会花上很多时间,但至少它不会再碍事了。
我很确定删除所有这些文件所需的时间是任务的内在要求,而不是执行删除时的低效率。
del /f /s /q /a foldername > nul
rmdir /s /q foldername
关于Magallanes的BAT文件,要非常小心地使用takeown和icacls,因为硬链接共享相同的权限和所有者,所以如果你想删除的文件夹里有未饱和的硬链接,使用takeown和icacls会改变文件夹外文件的权限和所有者。
使用 ln.exe 工具,你可以列出文件夹内所有硬链接的文件,并知道它们是否与文件夹外的文件硬链接(不饱和硬链接):
ln.exe --enum foldername > HardlinksList.txt
```。
你有没有试过这两个程序?
在源字段中输入要删除的路径,然后单击 “删除"。
这些应用程序不会将文件放入回收站。请谨慎使用。
这是对前面提到的答案中的步骤的补充和补充。
上面给出的两种方法似乎相当有效,但要确定性能是很困难的,除非在完全相同的条件下对它们进行基准测试。
然后通过批处理文件执行配置,并使用Powershell Cmdlet记录和测量其性能。
以下是一些示例文件夹(以总大小命名),我进行了实验,但无法得到任何结论性的性能/结果。
r.bat
rmdir /s/q 3.2G
rd.bat
del /f/s/q 3.3G > nul rmdir /s/q 3.3G
Powershell:
PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt
PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt