递归删除文件但排除特定文件的命令行

10

我需要使用命令行删除一个文件夹及其所有子文件夹中特定类型(例如 .zip 文件)的文件。最好是能够在Windows下将其作为 .bat 文件运行。

我知道 DEL 命令有一个 /S 开关,可以查找子文件夹中的文件,但是更具挑战性的是,我需要排除某个特定名称的文件(例如 "Backup.zip")。

是否有一种递归删除文件但排除某些特定名称文件的方法?在我的情况下,罗列出要删除的所有文件名是不实际的,只希望删除匹配类型但排除指定名称的文件。

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" 部分是一个重定向,通常用于隐藏标准输出,而不是在屏幕上显示它。如果过于频繁使用(例如在涉及不同路径的大循环中),它可能会很危险,因为它是一个设备,像所有设备一样(AUXCOMnLPTnNULPRN):
  • 打开设备将声明一个文件句柄。但与文件不同,设备将永远不会关闭,直到重新启动。
  • 每个设备都存在于每个驱动器上的每个目录中,因此如果您在例如C:\中使用重定向到NUL,然后在C:\TEMP中再次使用它,您将失去另一个文件句柄。

我还不理解"> NUL"这一部分,但我喜欢设置属性的想法。干杯! - Tim C
有趣!请注意,rd /s your_directory 还会删除系统和隐藏文件。 - Junior Mayhé

4

只需按照以下步骤操作,非常简单

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

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

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

del /S /ah .DS_Store

或者

del /S /ah ._*

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


3
您可以轻松地循环一组文件并对每个文件执行命令,像这样:
set match=D:\blah\M*.zip
for %%x in (%match%) do (
del %%x
)

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


2
您可以简单地使用以下代码:
forfiles /p C:\temp-new /s /c "cmd /c if @isdir==FALSE del @file"

TechNet 参考文档


这是微软官方提供的技术参考文档,包含了丰富的IT技术知识。

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 文件夹及其所有子文件夹中执行删除操作,包括所有级别。


1

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接