10

我需要使用命令行从文件夹及其所有子文件夹中删除某种类型的文件(例如 .zip 文件)。理想情况下,我正在寻找可以在 Windows 中作为 .bat 文件运行的东西。

我知道 DEL 命令有一个 /S 开关来查看子文件夹,但为了增加挑战,我需要排除某个名称的文件(例如“Backup.zip”)。

有没有办法递归删除文件但排除特定名称的文件。在我的情况下,明确列出我要删除的所有文件名是不切实际的,只列出我不想删除的匹配类型的文件。

4

7 回答 7

8

一个不错的技巧:将要排除的文件设为只读

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”部分是一个重定向,通常用于隐藏标准输出,而不是在屏幕上显示。
如果过于频繁使用(例如,在涉及不同路径的大循环中)可能会很危险,因为它是一个device ,并且像所有设备(AUXCOMnLPTn和)一样:NULPRN

  • 打开设备将要求一个文件句柄。但是,与文件不同的是,设备在重新启动之前永远不会关闭。
  • 每个设备都存在于每个驱动器上的每个目录中,因此,如果您使用重定向到NULin ,C:\然后在 中再次使用它C:\TEMP,您将丢失另一个文件句柄。
于 2009-02-11T10:04:27.303 回答
3

您可以轻松地循环一组文件并对每个文件执行一个命令,如下所示:

set match=D:\blah\M*.zip
for %%x in (%match%) do (
del %%x
)

那么我认为你需要阅读这篇关于如何在 DOS 中操作字符串的文章:http: //www.dostips.com/DtTipsStringManipulation.php

于 2009-02-11T09:50:09.243 回答
3

这样做,很简单

  1. 窗户按钮 + r
  2. 输入cmd并按回车
  3. 导航到父目录:
    键入c:d:(或您要导航到的驱动器的字母)
  4. 键入dir以查看该目录内容的列表(dir /ah查看隐藏文件)
  5. 然后要更改目录,请键入cd xxxx( xxxx = 目录名称)
  6. 重复 4&5,直到到达要运行批量删除的目录
  7. 然后键入您的模式。类似的东西:del /S /ah *.jpg然后按Enter。它将遍历所有子目录,并删除所有可见和隐藏的 .jpg 文件

*   是通配符
/S   从所有子文件夹中删除
/ah   a = 根据属性选择文件,h = 隐藏

示例:要删除从 Mac 复制到 Windows 时出现的那些烦人的 .DS_Store 文件,请运行:

del /S /ah .DS_Store

或者

del /S /ah ._*

这将获得从 Mac 复制到 Windows 时创建的所有“重复”隐藏文件。

于 2012-03-04T10:09:37.697 回答
2

您可以简单地在下面使用:

forfiles /p C:\temp-new /s /c "cmd /c if @isdir==FALSE del @file"

TechNet 参考在此处输入链接描述

于 2011-11-11T16:40:58.627 回答
1

也许“forfiles”命令可能有用

http://technet.microsoft.com/en-us/library/cc753551.aspx

希望有帮助。

于 2009-02-11T09:40:33.727 回答
1

此脚本将从文件夹(和子文件夹)中删除所有 .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 及其所有子文件夹上执行删除操作。

于 2010-02-21T18:39:22.720 回答
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

于 2021-07-10T12:23:55.960 回答