我有一个目录,该目录在Windows 2008服务器的某些子目录中包含约300万个文件。通过根目录上的SHIFT + DEL手动删除文件需要一段时间。还有其他方法可以更快地删除吗?

评论

在Stack Overflow上也被问到了:stackoverflow.com/questions/186737/…

如何将磁铁仅定位到某些子目录?

@Jaime像个真正的程序员一样稳重的双手... ;-) xkcd.com/378

如果是SSD驱动器怎么办?

Powershell的答案:stackoverflow.com/questions/1752677/…

#1 楼

警告:如果您有指向目录的符号链接,则del将删除实际目录而不是符号链接。对此要非常小心,除非您知道目标目录中没有符号链接,否则不要运行这些命令。


我经常需要从WinXP加密驱动器中删除大量文件和目录,通常在45,000个文件夹中的500,000个文件中大约有22 GB。

使用Windows资源管理器进行删除是垃圾,因为它浪费了许多枚举文件的时间。我通常将需要删除的内容移动到C:\ stufftodelete,并将deletestuff.bat批处理文件移动到rmdir /s/q C:\stufftodelete。它计划在晚上运行,但是有时我需要在白天运行,因此越快越好。

这是对5.85 MB的960个小样本文件进行快速测试的结果。 303个文件夹。我先运行方法1,然后运行方法2,然后重置测试目录。

方法1一次性删除文件和目录结构:

rmdir /s/q foldername


方法2首次删除文件并输出到nul避免为每个单一文件写入屏幕的开销。然后第二遍清理剩余的目录结构:

del /f/s/q foldername > nul
rmdir /s/q foldername



方法1:17.5s,14.9s,13.9s,14.8s,13.8s:平均14.98秒

方法2:14.3s,12.1s,11.7s,14.2s,11.8s:平均12.82秒


这里是使用另一项测试的结果3,243个文件夹中的404 MB的19,521个文件:


方法1:2分钟20秒

方法2:2分钟33秒


所以其中没有太多内容,可能太单一了,难以判断。


编辑:我已经用更多的数据进行了重新测试,这是一个典型的案例对我而言:28.3 GB的146,918个文件夹中的1,159,211个文件:


方法1:2h 15m,2h 34m:平均:2小时25分钟

方法2: 49m,57m:平均:53分钟


哇,方法2比方法1快三倍!我将更新我的deletestuff.bat!

评论


如果您指定绝对路径,则RD / S / Q效果很好,但是在使用相对路径时却不能。有解决方案吗?

– Michael S.
2012年1月31日上午7:25

@Hugo:Hugo,一个问题:在上述定时测试中,对于一种或两种方法,您在运行该方法之前是否立即对文件计数?我问是因为文件夹内容可能已经在OS文件缓存中。谢谢!

–威廉C
2012年10月10日15:19

@WilliamC:我记不清了,但是对于具有相同内容的重复删除,我将只在一次删除之前进行计数,而对于其他删除将不再重复(因为我已经知道数字了)。

–雨果
2012年10月10日17:21

当路径名超过256个字符时,rmdir和del都将失败。

–尼古拉·埃曼(Nicolai Ehemann)
16年11月15日在14:24

警告:如果您有指向目录的符号链接,则del将删除实际目录而不是符号链接。对此要非常小心,除非您知道目标目录中没有符号链接,否则不要运行这些命令。

–user0103
19-09-19在12:17

#2 楼

如果必须定期删除大目录树,请考虑将该目录树的根存储在单独的分区上,然后在需要删除所有内容时简单地对其进行快速格式化。如果需要自动执行此操作,则可以使用以下DOS命令:

echo Y | format Z: /FS:NTFS /X /Q


其中Z:是您的“易失性”分区。注意:分区必须没有标签。我在这里写了这个。

评论


如果需要精确的目录路径,请使用硬链接在存储文件的磁盘和目录之间创建连接。

– Nime Cloud
2011年11月22日12:07



@NimeCloud:硬链接不能跨文件系统或链接目录。

–user1686
2011-12-12 9:34

但是,符号链接可以跨文件系统和链接目录,因此在这里可能适用。请参阅mklink命令(Vista和更高版本;否则,请使用Mark Russinovich / SysInternals的联结。)

–罗伯特·卡尔洪(Robert Calhoun)
2012年7月19日15:37



#3 楼

在命令提示符下(开始->运行-> cmd):

del /f /s /q foldername 


评论


这很棒,因为它列出了其删除的内容..但在速度方面与rd相同。

– bobobobo
09年8月8日在16:10

哦,哇,哇。没我想的那么好。它可以快速删除文件,但保留目录树不变。

– bobobobo
09年8月8日在16:13

我可能要花很长时间才能清除使用rd。

– bobobobo
09年8月8日在16:15

@bobobobo我用〜30GB / 1,000,000个文件/ 15,000个文件夹进行了一些测试,而del + rd比rd快了三倍:superuser.com/questions/19762/mass-deleting-files-in-windows/…

–雨果
2011年6月1日21:25

如果路径名超过256个字符,则此操作将失败。

–尼古拉·埃曼(Nicolai Ehemann)
16-11-15在14:23

#4 楼

除了非常快速地复制/移动文件(使用其自己的API)之外,TeraCopy还可以删除文件,而且速度也非常快。自从发现TeraCopy以来,如果没有安装(如果我要复制/移动/删除),我就不会使用计算机。

同一安装程序会安装x64版本,但要使用它,您必须手动安装强制使用它。

我推荐的稳定版本的beta:http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/

评论


您是否曾经完成或看到过TeraCopy与rmdir或del或del + rmdir的类似时间比较?

–雨果
2011年6月1日21:29

@雨果:愚蠢的问题。如果用肉眼看不到TeraCopy,我不建议这样做,它更快!

– rautamiekka
2011年6月20日20:50



那么您估计它快10%吗?两倍快?快十倍?快一百万倍?如果您可以使用两个大型且相同的测试集针对rmdir设置时间,那就太好了。

–雨果
2011年6月20日21:05

谢谢!我已经使用TeraCopy多年了,但是从不知道批量删除功能。您说对了,速度要快得多!

– Azzton
17年5月23日在20:11

@Amalgovinus你不知道。您可以打开程序并通过拖放或右键单击来添加文件/文件夹,或者在资源管理器中/在桌面上右键单击文件/文件夹。遍历它们之后,如果需要,只需单击“删除”和“移至回收站”,但我赞成“从磁盘删除”。但是,如果默认情况下未完成操作,则需要以管理员身份启动TeraCopy才能使其显示在桌面/资源管理器中。

– rautamiekka
19年6月6日在22:48

#5 楼

我做了一个与bat文件相同的文件。



它分两步完成工作,第一步,它尝试删除文件。其次是尝试获取文件的所有权。 y应该根据您的当地语言进行更改(英语为yes)。
如果任务失败(例如,由于许可而失败),则必须再次运行它。但是,第二轮将不会尝试删除在第一轮中删除的文件,因此可能会很快。


如何使用它。另存为路径路由中的delfolder.bat(例如c:\ windows),然后将其运行为

@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


其中foldername是文件夹的名称

在我的测试中,删除123'000个文件花费了3分钟(sata 7200rpm)。耶!

评论


通常,您不应在脚本中使用%1,而应使用“%〜1”。这样,如果参数已用引号传递,则将其取消引用并重新引用。如果尚未使用引号将其传递,则将其引号。

–天赋
18年1月23日在7:28

#6 楼

使用下面的代码通常对我来说效果很好。

mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe


评论


在该robocopy调用的末尾添加一个“> nul”,这样您就不必在屏幕上看到它了。

– JoshDM
13年11月18日在18:13

它类似于在Linux中使用rsync。甚至比rmdir还快吗?

–Hastur
16-3-24在15:06



仅供参考,此robocopy与del / f / q / s + rmdir / s / q有很大不同。如果dir_to_wipe包含c:\ some_important_dir垃圾邮件,则最终将丢失数据。

– Pavel P
18年1月16日在18:54

@Pavel然后使用/ XJ排除连接点和符号链接?

–伯恩哈德
19年5月22日在9:48

对于〜36GB的目录,它有成百上千个目录和文件,这些目录和文件的长度大于256个字符,这会导致欺骗,导致del / rmdir“方法”失败。这花了几秒钟,Windows资源管理器估计了HOURS!

–user22908
19年7月19日在0:48



#7 楼

在命令提示符下使用rd / s命令。

评论


不。这与从资源管理器中删除一样慢。

– bobobobo
09年8月8日在16:08

好吧,没关系。无论如何,它比del / f / s / q更好。

– bobobobo
09年8月8日在16:15

嗯,这实际上比使用资源管理器删除要好得多。它会继续删除,即使删除一次或两次失败(资源管理器阻塞并中止)

– bobobobo
09年8月8日在20:14

#8 楼

最好的实用解决方案可能是将文件夹移开某个位置(例如回收站),然后开始删除它。这会花很多时间,但至少会不合时宜。

我很确定删除所有这些文件所需的时间是任务的固有要求,而不是效率低下在执行删除操作时。

#9 楼

安装Cygwin并使用rm -r。但这可能是过大的。

评论


这与rd / q / s完全相同...

–乔伊
2010-3-17在9:28



任务太多,速度差不多!

–adeelx
10-4-4在3:51

这并不比这里的其他几个安装工具X和使用情况答案差,如果没有答案,则不应被否决。

– JdeBP
2011年6月1日22:02

cygwin rm真的和内置的cmd.exe一样快吗?由于posix接口的cygwin仿真相当慢,因为它需要做一些额外的工作,所以rm实际上并没有体会到。

– Jan Hudec
13年6月18日在11:59



在等待删除大量文件时,我有足够的时间安装Cygwin并尝试rm -rf。在大约10分钟后,我中止了操作,然后返回del / f / s / q,因为在Cygwin下,磁盘使用率仅为50%。在del下,磁盘使用率固定为100%。因此,我认为它的删除速度必须更快。两种方法的CPU使用率均小于1%。我不确定文件号,因为我花了10分钟计算后关闭了Windows File Deleter。

–德里克·齐姆巴(Derek Ziemba)
18年4月18日在4:18

#10 楼

您是否启用了短文件名生成?如果是这样,您真的需要吗?删除文件只是元数据出现。因此,如果要删除的名称数量是原来的两倍,那么工作量就会大大增加。

#11 楼

您是否尝试过这两个应用程序之一?


保护文件删除
磁盘和文件复制器

确保将覆盖次数设置为0如果您想要最快的性能。通过单击选项来执行此操作,然后更改对话框底部的值。

在“源”字段中输入要删除的路径,然后单击“删除”。

这些应用程序不会将文件放入回收站。小心使用。

#12 楼

提供此信息是为了补充和扩大前面提到的答案中采取的步骤。

上面给出的两种方法似乎非常有效,但要确定性能,除非将它们置于完全相同的条件下,否则将很困难:


物理硬盘设备和型号


最好在克隆数据之前先对ATTO / Crystal Disk进行基准测试



相同的分区/卷位置和几何


执行此操作的方法是对示例分区/文件夹进行碎片整理,并完全克隆它们,因为它们是2种完全相同的硬盘驱动器类型(来自上一步)



然后通过批处理文件执行配置,并使用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


评论


失败,名称> 256个字符

–user22908
19年7月19日在0:50

#13 楼

雨果(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


#14 楼

删除文件夹比删除多个文件快。

因此,如果您更喜欢使用鼠标而不是命令提示符,则可以创建目录,将文件移动到那里并删除它(如您所说的Shift + Del)。

评论


该目录应在文件所在的同一分区上创建。这将使移动动作瞬间完成。如果新文件夹和文件位于单独的分区上,则整个复制操作将持续很长时间。

–lmsasu
09年8月7日在7:15

您从哪里得知删除文件夹比删除其中的文件更快?删除文件夹的第一步是删除该文件夹中的所有文件,因此它不可能更快。不过,转移到回收站是完全不同的事情,但这不是这里的问题。

–乔伊
09年8月7日在22:40