在Windows中批量删除文件


141

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


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

6
如何将磁铁仅定位到某些子目录?
Jaime Hablutzel 2014年

7
@Jaime有了一个稳定的手,像一个真正的程序员... ;-) xkcd.com/378
Legionair

如果是SSD驱动器怎么办?
本杰明·魏斯2014年

Answers:


179

警告: 如果您有指向目录的符号链接,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
  • 方法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秒

因此,其中没有太多内容,可能太接近以至于无法通过单个测试进行判断。


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

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

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


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

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

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

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

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

18

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

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

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


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

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

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

9

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

del /f /s /q foldername 

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

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

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

3
@bobobobo我做了一些测试用〜30GB / 1000000-文件/文件夹15000德尔和RD +不仅仅是RD快了近三倍:superuser.com/questions/19762/mass-deleting-files-in-windows/...
雨果

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

7

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

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

我建议使用稳定版本的Beta:http : //blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/


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

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

5
那么您估计它快10%吗?两倍快?快十倍?快一百万倍?如果您可以使用两个大型且相同的测试集将其与rmdir相对应,那就太好了。
雨果

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

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

6

我做了同样的蝙蝠文件。

@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在脚本中使用,而是使用"%~1"。这样,如果参数已用引号传递,则会将其取消引用并重新引用。如果尚未使用引号将其传递,则将其引号。
Benoit

4

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

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

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

它类似于rsyncLinux中的用法。甚至更快rmdir吗?
Hastur

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

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

对于〜36GB的目录,它有成百上千的目录和文件,这些目录和文件> 256个字符,导致del / rmdir“方法”严重失败,从而达到了目的。这花了几秒钟,Windows资源管理器估计了HOURS!

3

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


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

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

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

2

最好的实用解决方案可能是将文件夹移开某个位置(例如回收站),然后开始删除它。这将需要很长时间,但至少会被排除在外。

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


1

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


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

任务太多,速度差不多!
adeelx

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

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

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

1

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


0

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

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

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

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


0

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

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

  • 物理硬盘设备和型号
    • 最好在克隆ATTO / Crystal Disk上的数据之前进行基准测试
  • 相同的分区/卷位置和几何
    • 进行此操作的方法是对示例分区/文件夹进行碎片整理并完全克隆它们,因为它们是2种完全相同类型的硬盘(来自上一步)
  • 然后通过批处理文件执行配置,并使用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

失败,名称> 256个字符

0

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

-1

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

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


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

5
您从哪里知道删除文件夹比删除其中的文件更快?删除文件夹包含作为其第一步,删除全部文件,该文件夹,因此它不能更快。虽然转移到回收站是完全不同的事情,但这不是这里的问题。
乔伊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.