我需要使用命令行从文件夹及其所有子文件夹中删除某种类型的文件(例如.zip文件)。理想情况下,我正在寻找可以在Windows中作为.bat文件运行的东西。
我知道DEL命令有/ S开关可以查看子文件夹,但要添加到挑战中我需要排除某个名称的文件(“Backup.zip”作为示例)。
是否有办法递归删除文件但排除某个名称的文件。在我的情况下,明确列出我要删除的所有文件名是不切实际的,只有我不想删除的匹配类型的文件。
答案 0 :(得分:8)
一个很好的技巧:制作files you want to exclude read-only!
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
实际上可以帮助您排除当前目录和所有子目录的所有“xxx”文件(因此/S
选项)。
注意:“> NUL
”部分是 redirection ,通常用于隐藏标准输出,而不是在屏幕上显示。
如果经常使用(例如,在涉及不同路径的大型循环中)可能会很危险,因为它是设备,并且像所有设备一样(AUX
,COMn
,LPTn
,NUL
和PRN
):
NUL
,比如C:\
,之后又在C:\TEMP
中再次使用它,那么您将会丢失另一个文件句柄。答案 1 :(得分:3)
您可以轻松地循环一组文件并对每个文件执行命令,如下所示:
set match=D:\blah\M*.zip
for %%x in (%match%) do (
del %%x
)
然后我认为你需要阅读这篇关于如何在DOS中操作字符串的文章: http://www.dostips.com/DtTipsStringManipulation.php
答案 2 :(得分:3)
只需这样做,轻松
cmd
并按Enter 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时也创建的所有“重复”隐藏文件。
答案 3 :(得分:2)
您可以在下面使用:
forfiles /p C:\temp-new /s /c "cmd /c if @isdir==FALSE del @file"
答案 4 :(得分:1)
答案 5 :(得分:1)
此脚本将删除文件夹(和子文件夹)中的所有.zip文件,但仅限于文件名不包含“备份”,“备份”或“备份”等字样。
# 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及其所有子文件夹执行删除操作。
答案 6 :(得分:0)
您需要的简单方法:
FORFILES /P "DIRECTORY" /S /M SEARCHMASK /C "cmd /c if @file neq \"FILE_TO_EXCLUDE\" del /f @file"
您仍然可以根据需要调整命令以排除特定文件和/或按日期。下方“forfiles”文档中的更多详细信息。
https://docs.microsoft.com/pt-br/windows-server/administration/windows-commands/forfiles