我需要使用命令行删除一个文件夹及其所有子文件夹中特定类型(例如 .zip 文件)的文件。最好是能够在Windows下将其作为 .bat 文件运行。
我知道 DEL 命令有一个 /S 开关,可以查找子文件夹中的文件,但是更具挑战性的是,我需要排除某个特定名称的文件(例如 "Backup.zip")。
是否有一种递归删除文件但排除某些特定名称文件的方法?在我的情况下,罗列出要删除的所有文件名是不实际的,只希望删除匹配类型但排除指定名称的文件。
我需要使用命令行删除一个文件夹及其所有子文件夹中特定类型(例如 .zip 文件)的文件。最好是能够在Windows下将其作为 .bat 文件运行。
我知道 DEL 命令有一个 /S 开关,可以查找子文件夹中的文件,但是更具挑战性的是,我需要排除某个特定名称的文件(例如 "Backup.zip")。
是否有一种递归删除文件但排除某些特定名称文件的方法?在我的情况下,罗列出要删除的所有文件名是不实际的,只希望删除匹配类型但排除指定名称的文件。
DEL /S
不会删除只读文件。@ECHO OFF
:: This example supposes your first parameter is
:: the relative path to the folder to be deleted
:: and the second is the relative path (from the
:: the target folder) of the one to be excluded
:: Notice that this will only work if the folders
:: are in the working drive, if not, you ll
:: have to specify full paths
IF "%1"=="" GOTO ERROR
IF "%2"=="" GOTO ERROR
IF NOT EXIST %1\NUL GOTO ERROR
CD %1
IF NOT EXIST %2\NUL GOTO ERROR
ECHO Starting up the deletion process
ECHO. * Setting attributes
attrib %1\*.mp3 -r -s -h > NUL
attrib %2\*.mp3 +r > NUL
ECHO. * Deleting files
del /s %1\*.mp3
ECHO. * Reseting attributes
attrib %2\*.mp3 -r > NUL
ECHO.
ECHO Operation completed!
ECHO.
GOTO END
:ERROR
ECHO Parameters:
ECHO. Param1 -> target folder
ECHO. Param2 -> folder to be ignored
ECHO.
GOTO END
:END
attrib /S *.xxx +r > NUL
> NUL
" 部分是一个重定向,通常用于隐藏标准输出,而不是在屏幕上显示它。如果过于频繁使用(例如在涉及不同路径的大循环中),它可能会很危险,因为它是一个设备,像所有设备一样(AUX
、COMn
、LPTn
、NUL
和 PRN
):
C:\
中使用重定向到NUL
,然后在C:\TEMP
中再次使用它,您将失去另一个文件句柄。只需按照以下步骤操作,非常简单
cmd
并按回车键c:
或 d:
(或要导航到的驱动器的字母)
dir
以查看该目录的内容(dir /ah
可查看隐藏文件)cd xxxx
(xxxx = 目录名称)以更改目录del /S /ah *.jpg
,然后按回车键。它将遍历所有子目录,并删除所有可见和隐藏的.jpg文件* 是通配符
/S 从所有子文件夹中删除
/ah a = 根据属性选择文件,h = 隐藏
示例:要删除在从Mac复制到Windows时出现的那些恼人的.DS_Store文件,请运行:
del /S /ah .DS_Store
或者
del /S /ah ._*
这将获取从Mac复制到Windows时创建的所有“重复”隐藏文件。
set match=D:\blah\M*.zip
for %%x in (%match%) do (
del %%x
)
我认为您需要阅读这篇关于如何在DOS中操作字符串的文章:http://www.dostips.com/DtTipsStringManipulation.php
forfiles /p C:\temp-new /s /c "cmd /c if @isdir==FALSE del @file"
该脚本将从文件夹(及其子文件夹)中删除所有.zip文件,但仅当文件名不包含单词"backup"、"Backup"或"BACKUP"等字样时。
# Script DeleteZip.txt
var str folder, filelist, file
cd $folder
lf -r -n "*.zip" > $filelist
while ($filelist <> "")
do
lex "1" $filelist > $file
# Does this $file contain the word "backup" ? Do case independent search (-c option).
if ( { sen -c "^backup^" $file } <= 0 )
system del ("\""+$file+"\"")
endif
done
脚本使用 biterscripting(http://www.biterscripting.com)编写。将脚本保存在文件C:/Scripts/DeleteZip.txt中。以以下方式运行脚本:
script "C:/Scripts/DeleteZip.txt" folder("C:/testfolder")
将在 C:/testfolder 文件夹及其所有子文件夹中执行删除操作,包括所有级别。
FORFILES /P "DIRECTORY" /S /M SEARCHMASK /C "cmd /c if @file neq \"FILE_TO_EXCLUDE\" del /f @file"
您仍可以根据需要调整命令以排除特定文件和/或按日期分离。更多细节请参见下面的“forfiles”文档。
https://learn.microsoft.com/pt-br/windows-server/administration/windows-commands/forfiles