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

Posted

技术标签:

【中文标题】使用批处理文件在目录下递归删除所有特定类型(扩展名)的文件【英文标题】:Delete all files of specific type (extension) recursively down a directory using a batch file 【发布时间】:2012-10-19 20:02:55 【问题描述】:

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

我在第二个 sn-p 中缺少什么?为什么它不起作用?

【问题讨论】:

如果您提供更多关于它如何确切“不起作用”的信息将会有所帮助。实际结果与预期结果有何不同?您收到错误消息吗?哪个? 【参考方案1】:

您可以在del 命令和/S 中使用通配符以递归方式执行此操作。

del /S *.jpg

附录

@BmyGuest 询问为什么一个被否决的答案 (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.dll project.dllold,这可能会令人惊讶。有关更多详细信息,请参阅this answer on SU。

【讨论】:

在最后添加一行pause 可以让用户看到完整的日志信息。 感谢 Laf 的补充。我认为这将有助于其他人发现这一真正重要的区别。 如果有人想从特定目录中删除,您可以将cddel 命令与`&' 结合使用,请参阅***.com/q/8055371/7429464 @FindOutIslamNow 或者您可以在del 命令中指定完整路径,而无需更改当前目录。 我注意到,当我这样做时,它会删除任何以指定文件扩展名开始的文件扩展名。例如,如果我在一个文件夹中有.jsx 文件和.jsxbin 文件并使用del /S *.jsx,它也会删除.jsxbin 文件。在*.jsx 周围加上引号并没有改变任何东西。有没有办法强制它删除具有指定扩展名的文件?【参考方案2】:

如果您尝试删除 C: 驱动器中的某些 .extensions,请使用此 cmd:

del /s c:\*.blaawbg

我有一个客户感染了加密病毒,我需要找到所有垃圾文件并删除它们。

【讨论】:

这似乎非常不安全。 这个答案(-2 票)和接受的答案(+42 票)之间的主要区别是什么? @BmyGuest 主要区别在于,如果您在子文件夹的某处执行我的命令,它只会影响位于该子文件夹下的文件。在此答案中,您删除了与整个驱动器中的文件名匹配的 everything。因此,如果您想删除项目中的一些 dll 文件,并且您错误地输入了del /s c:\*.dll,那么您将大吃一惊。 切勿在整个驱动器上运行此类命令,除非绝对必要。 我认为这个答案不值得这么多反对。答案解释了此命令适用于整个驱动器(以及为什么)。如果此人不想要整个驱动器,则应将 c: 替换为所需的文件夹。 我认为它需要尽可能多的反对票,因为它可以作为免责声明和不该做的警告。你真的可以通过复制、粘贴和执行这样的代码来搞砸事情。 bash 中内置了许多复活节彩蛋,以“安全”的方式教授这个确切的课程。这个例子可能会毁了你的一天。最好的!【参考方案3】:

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

@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 是您选择的扩展名)就可以了。【参考方案4】:

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

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

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

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

【讨论】:

这对我有用,比编写批处理脚本更简单。【参考方案5】:

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

@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

显示实际输出。

【讨论】:

【参考方案6】:

就是这样:

@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:用你的文件夹替换文件夹路径

【讨论】:

以上是关于使用批处理文件在目录下递归删除所有特定类型(扩展名)的文件的主要内容,如果未能解决你的问题,请参考以下文章

powershell 递归删除具有特定扩展名的所有文件

正确地递归忽略特定文件夹下的所有文件,特定文件类型除外

递归遍历指定目录下所有指定的文件并删除

递归查找具有特定扩展名的文件

Windows删除文件夹下的指定格式文件(递归删除)

查找某个目录下使用的所有文件扩展名(递归)