使用批处理文件递归地删除目录下特定类型(扩展名)的所有文件

114

我需要删除dir1和dir2中的所有.jpg和.txt文件(例如)。

我尝试过的方法是:

@echo off
FOR %%p IN (C:\testFolder D:\testFolder) DO FOR %%t IN (*.jpg *.txt) DO del /s %%p\%%t

在某些目录中它有效,在其他目录中则无效。
例如,这并没有起作用:
@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

第二段代码有什么问题?为什么它不能正常工作?

如果你能提供更多关于它“为什么不起作用”的具体信息,那会很有帮助。实际结果与预期结果有何差异?是否收到错误消息?是哪个? - Ansgar Wiechers
7个回答

281
你可以在del命令中使用通配符,并使用/S进行递归操作。 del /S *.jpg 补充说明:
@BmyGuest问为什么被downvote的答案(del /s c:\*.blaawbg)与我的答案有任何区别。
使用del /S *.jpgdel /S C:\*.jpg执行存在很大的区别。第一条命令从当前位置执行,而第二条命令则会在整个驱动器上执行。
如果您使用第二条命令删除jpg文件,可能会导致某些应用程序停止工作,并且您将失去所有家庭照片。这非常恼人,但您的计算机仍将能够运行。
然而,如果您正在处理某个项目,并希望删除myProject\dll中的所有dll文件,并运行以下批处理文件:
@echo off

REM This short script will only remove dlls from my project... or will it?

cd \myProject\dll
del /S /Q C:\*.dll

然后你最终会删除 C:\ 驱动器中的所有 dll 文件。你的所有应用程序都将停止工作,电脑变得毫无用处,而在下一次重启时,你将被传送到第四维度,永远无法回来。

这里的教训是,如果可以避免,在驱动器的根目录(或其他可能存在危险的位置,比如 %windir%)不要直接运行此类命令。请始终在尽可能本地的位置运行它们。

补充说明 2

通配符方法将尝试匹配所有文件名,以它们的8.3格式和“长名称”格式。例如,*.dll 将匹配 project.dllproject.dllold,这可能令人惊讶。有关更详细的信息,请参见SU上的此答案


3
在末尾添加一行 pause 命令可以让用户查看完整的日志信息。 - KNU
2
谢谢你的补充,Laf。我认为这将有助于其他人发现这个确实重要的区别。 - BmyGuest
如果有人想从特定目录中删除文件,可以将 cddel 命令与 & 结合使用,参见 https://dev59.com/sWsz5IYBdhLWcg3wNU8R。 - FindOutIslamNow
@FindOutIslamNow 或者您可以在 del 命令中指定完整路径,而无需更改当前目录。 - Laf
2
我注意到当我这样做时,它会删除任何以指定扩展名_开头_的文件扩展名。例如,如果我在一个文件夹中有.jsx文件和.jsxbin文件,并使用del /S *.jsx,它也会删除.jsxbin文件。在*.jsx周围加上引号没有改变任何东西。是否有一种方法强制它仅删除具有指定扩展名的文件? - Marty
显示剩余2条评论

10
您可以使用此方法删除文件夹及其子文件夹中的所有文件:
DEL "C:\Folder\*.*" /S /Q

或者使用此方法仅删除特定文件类型:

DEL "C:\Folder\*.mp4" /S /Q 
DEL "C:\Folder\*.dat" /S /Q 

这对我很有效,而且比编写批处理脚本更简单。 - hashedram

5

我之前写了一个批处理脚本,可以让你选择要删除的文件扩展名。脚本将在它所在的文件夹和所有子文件夹中查找具有该扩展名的任何文件并将其删除。

@ECHO OFF
CLS

SET found=0
ECHO Enter the file extension you want to delete...
SET /p ext="> "

IF EXIST *.%ext% (           rem Check if there are any in the current folder :)
  DEL *.%ext%
  SET found=1
)
FOR /D /R %%G IN ("*") DO (  rem Iterate through all subfolders
  IF EXIST %%G CD %%G
  IF EXIST *.%ext% (
    DEL *.%ext%
    SET found=1
  )
)

IF %found%==1 (
  ECHO.
  ECHO Deleted all .%ext% files.
  ECHO.
) ELSE (
  ECHO.
  ECHO There were no .%ext% files.
  ECHO Nothing has been deleted.
  ECHO.
)

PAUSE
EXIT

希望这对任何需要的人都有用:)

另外,如果您已经安装了Bash(Cygwin,WSL等),那么一个简单的find . -name“*.ext”-type f -delete(其中ext是您选择的扩展名)就可以完成。 - Pyroglyph

1

我没有足够的声望来添加评论,所以我将其发布为答案。 但是对于这个命令的原始问题:

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

第一个for循环缺少递归语法,应该是:
@echo off
FOR /R %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

你可以这样做:

你只需要:

FOR %%p IN (C:\Users\0300092544\Downloads\Ces_Sce_600) DO @ECHO %%p

展示实际输出。

0

这就是它:

@echo off

:: del_ext
call :del_ext "*.txt"
call :del_ext "*.png"
call :del_ext "*.jpg"

:: funcion del_ext
@echo off
pause
goto:eof
:del_ext
 set del_ext=%1
 del /f /q "folder_path\%del_ext%"
goto:eof

注意:将 folder_path 替换为您的文件夹路径。


0

步骤1: 使用cd命令导航到相关文件夹

例如: cd C:\Users\tremanleo\Desktop\HoldLEOCMS

步骤2: 删除指定文件类型。

例如: DEL *.bak


-11

如果您想删除 C: 驱动器中的某些 .extensions,请使用此命令:

del /s c:\*.blaawbg

我曾经遇到一个客户被加密病毒感染,我需要找到所有的垃圾文件并将其删除。

14
这似乎非常不安全。 - dudewad
6
这个答案(-2票)和被采纳的答案(+42票)之间的主要区别是什么? - BmyGuest
7
主要区别在于,如果您在子文件夹中执行我的命令,则仅会影响该子文件夹中的文件。在这个答案中,您将删除整个驱动器中匹配文件名的所有内容。因此,如果您想要删除项目中的某些dll文件,并且错误地键入“del /s c:*.dll”,那么您将面临非常糟糕的后果。除非绝对必要,否则永远不要在整个驱动器上运行此类命令。 - Laf
3
我认为这个回答不应该收到那么多负评。这个回答解释了这个命令适用于整个驱动器(并解释了为什么)。如果用户不想使用整个驱动器,应将“c:”替换为所需文件夹。 - user1527152
3
我认为这篇文章应该被尽可能多的点踩,甚至更多,因为它起到了免责声明和警示的作用,告诉你不要采取这样的行动。如果你照着复制、粘贴并执行代码,将会严重搞砸事情。Bash 里面有很多彩蛋可以以“安全”的方式教导这个课程…但是这个例子可能会毁掉你的一天。祝好! - jacktrader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接