我有一个目录,在Windows 2008服务器的某些子目录中包含〜300万个文件。通过根目录上的SHIFT + DEL手动删除文件需要一段时间。还有其他方法可以更快地删除吗?
我有一个目录,在Windows 2008服务器的某些子目录中包含〜300万个文件。通过根目录上的SHIFT + DEL手动删除文件需要一段时间。还有其他方法可以更快地删除吗?
Answers:
警告: 如果您有指向目录的符号链接,del
则将删除实际目录而不是符号链接。对此要非常小心,除非您知道目标目录中没有符号链接,否则不要运行这些命令。
我通常需要从WinXP加密驱动器中删除很多文件和目录,通常在45,000个文件夹中的500,000个文件中大约有22 GB。
使用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
这是在3,243个文件夹中使用404 MB的19,521个文件的另一项测试的结果:
因此,其中没有太多内容,可能太接近以至于无法通过单个测试进行判断。
编辑:我已经用更多的数据进行了重新测试,这对我来说是一个典型的例子:146,918个文件夹中的28.3 GB的1,159,211个文件:
哇,方法2比方法1快三倍!我将更新我的deletestuff.bat!
del
则将删除实际目录而不是符号链接。对此要非常小心,除非您知道目标目录中没有符号链接,否则不要运行这些命令。
如果必须定期删除大目录树,请考虑将该目录树的根存储在单独的分区上,然后在需要删除所有内容时简单地对其进行快速格式化。如果需要自动执行此操作,则可以使用以下DOS命令:
echo Y | format Z: /FS:NTFS /X /Q
Z:是您的“易失性”分区。注意:分区必须没有标签。我在这里写了这个博客。
在命令提示符下(开始->运行-> cmd
):
del /f /s /q foldername
除了非常快速地复制/移动文件(使用其自己的API)之外,TeraCopy还可以删除文件,而且速度也非常快。自从发现TeraCopy之后,我就不会在未安装计算机的情况下使用它(如果我要复制/移动/删除)。
相同的安装程序会安装x64版本,但要使用它,您必须手动强制使用它。
我建议使用稳定版本的Beta: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)。好极了!
%1
在脚本中使用,而是使用"%~1"
。这样,如果参数已用引号传递,则会将其取消引用并重新引用。如果尚未使用引号将其传递,则将其引号。
使用以下代码通常对我来说效果很好。
mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
rsync
Linux中的用法。甚至更快rmdir
吗?
del /f/q/s
+ 非常不同rmdir /s/q
。如果dir_to_wipe有垃圾邮件,c:\some_important_dir
则最终将丢失数据。
最好的实用解决方案可能是将文件夹移开某个位置(例如回收站),然后开始删除它。这将需要很长时间,但至少会被排除在外。
我很确定删除所有这些文件所需的时间是任务的固有要求,而不是删除实现的效率低下。
安装Cygwin并使用rm -r。但这可能是过大的。
rd /q /s
rm
真的和内置的cmd.exe一样快rd
吗?由于posix接口的cygwin仿真相当慢,因为它需要做一些额外的工作,因此rm
实际上并没有意识到。
rm -rf
。在大约10分钟后,我中止了工作,然后又回到了原来的位置,del /f/s/q
因为在Cygwin的支持下,磁盘使用率仅为50%。在下del
,磁盘使用率固定为100%。因此,我认为它的删除速度必须更快。两种方法的CPU使用率均小于1%。我不确定文件号,因为我花了10分钟计算后关闭了Windows File Deleter。
提供此信息是为了补充和扩大前面提到的答案中采取的步骤。
上面给出的两种方法似乎非常有效,但是要确定性能,除非将它们置于完全相同的条件下是困难的:
然后通过批处理文件执行配置,并使用Powershell Cmdlet记录并评估其性能。
以下是我尝试过的一些示例文件夹(命名为总大小),但无法获得任何确定的性能/结果。
蝙蝠
rmdir /s/q 3.2G
蝙蝠
del /f/s/q 3.3G > nul rmdir /s/q 3.3G
电源外壳:
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
Hugo的答案是最快的,但是它不会在第一遍中删除隐藏文件或系统文件,因此,如果您想获得更完整的解决方案,请使用参数/ a:
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