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


84

我需要删除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,2012年

Answers:


202

您可以在del命令中使用通配符,并/S以递归方式进行操作。

del /S *.jpg

附录

@BmyGuest问为什么低级答案(del /s c:\*.blaawbg)与我的答案有什么不同。

和之间存在巨大差异。第一个命令从当前位置执行,而第二个命令在整个驱动器上执行。del /S *.jpgdel /S C:\*.jpg

jpg使用第二个命令删除文件的情况下,某些应用程序可能会停止运行,并且最终将丢失所有家庭照片。这非常令人讨厌,但是您的计算机仍然可以运行。

但是,如果您正在处理某个项目,并且想要删除中的所有dll文件myProject\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

然后,您最终从驱动器中删除了所有dll文件C:\。您所有的应用程序都停止工作,您的计算机变得无用,并且在下次重新启动时,您将被传送到第四维,在那里您将永远陷入困境。

%windir%如果不能避免的话,这里的教训是不要在驱动器的根部(或其他可能有危险的位置,例如)直接运行该命令。始终尽可能在本地运行它们。


3
最后添加一行 pause将允许用户查看完整的日志信息。
KNU

2
感谢您的附录Laf。我认为这将帮助其他人发现这一确实重要的差异。
BmyGuest '16

如果有人想从一个特定的目录中删除,你可以结合cddel命令与'&”看到stackoverflow.com/q/8055371/7429464
FindOutIslamNow

@FindOutIslamNow,或者您可以在del命令中指定完整路径,而不必更改当前目录。
拉夫

请注意以下几点-如果找不到要删除的文件,则会导致错误。
杰米·马歇尔

4

不久前,我写了一个批处理脚本,使您可以选择要删除的文件扩展名。该脚本将在其所在的文件夹以及所有带有该扩展名的文件的所有子文件夹中查找并删除它。

@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是您选择的扩展)。
pylylyph

3

您可以使用它删除文件夹和子文件夹中的所有文件:

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

或使用它仅删除某些文件类型:

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

0

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

@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

pd:用您的文件夹替换folder_path


-11

如果您要删除C:驱动器中的某些.extensions,请使用以下cmd:

del /s c:\*.blaawbg

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


13
这似乎非常不安全。
dudewad

5
这个答案(-2票)和被接受的答案(+42票)之间的主要区别是什么?
BmyGuest

6
@BmyGuest主要区别是,如果您在子文件夹中的某个位置执行我的命令,则只会影响该子文件夹下的文件。在这个答案,你删除一切,在整个驱动器相匹配的文件名。因此,如果您想删除项目中的某些dll文件,并且错误地键入del /s c:\*.dll,那么您将感到非常意外。除非绝对必要,否则切勿在整个驱动器上运行此类命令。
Laf

2
我认为这个答案不应该这么多。答案说明此命令适用于整个驱动器(以及原因)。c:如果此人不想要整个驱动器,则应将其替换为所需的文件夹。
user1527152 '18

2
我认为,它需要尽可能多的否决票,因为它是免责声明和警告不要做的事情。您可以通过复制,粘贴和执行这样的代码来真正解决问题。Bash中内置了许多复活节彩蛋,以“安全”的方式教授这一课程。.这个例子可能会破坏您的一天。最好!
jacktrader19年
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.