在其中找到文件扩展名时删除文件夹和子目录

时间:2012-04-04 14:09:07

标签: batch-file

我是新手,所以请放轻松! :)

基本上,我正在编写一个批处理文件,用于删除的文件夹中包含特定扩展名类型的文件。

所以例如,如果我有以下文件夹

C:\MUSIC\FLAC\JAZZ\Jazzysong.ape

我需要一些可以删除JAZZ文件夹的代码,因为.ape是FLAC文件夹的错误文件类型。

任何帮助都会很棒,因为我尝试了findstrexist的变体并写入文本文件并尝试使用dir /s /b

读取路径

我迷失了

1 个答案:

答案 0 :(得分:2)

在决定删除目录之前,我仍然不确定要对目录执行哪种测试 - “是否存在某种文件类型”“是否确定文件类型不存在“。你的帖子似乎暗示它是后者,所以它必须是误导性的标题。出于这个答案的目的,我假设它确实是“是否某个文件类型不存在”测试你想要的。

这是解决问题的一种非常简单和谦逊的方法:

@ECHO OFF
FOR /D /R "D:\directory_with_flac_files_only" %%D IN (*) DO (
  IF NOT EXIST "%%D\*.flac" ECHO RD /S /Q "%%D"
)

也就是说,只需遍历目录树,并为每个子目录检查它是否包含必要的文件。如果没有,请告别它。 (为了安全起见,我在ECHO命令之前添加了RD,这样它确实说出了再见但是没有执行实际操作,以防万一你急于执行脚本没有进一步阅读。)

然而,这种做法是错误的。即使目录可能不包含所需文件,其 sub - 目录也可能,并且此脚本不会验证该事实。因此,您可能会丢失一些宝贵的FLAC文件。 (而我刚刚救了你的悲痛。)

因此,这里需要更精细的内容。我提出的方法包括以下步骤:

  1. 将目录分为两类:包含具有必要扩展名的文件和不包含文件的目录。

  2. 处理不包含文件的目录列表:

    1)如果在另一个列表中找到目录,则省略它;

    2)如果在其他列表中找不到,请将其删除。

  3. (如果您想知道:第一个列表中的目录确实可以在第二个列表中找到其子目录路径的 part 。)

    我远没有确信这是最好的方法,但至少它应该有效(无论如何它确实适用于我)。这是我的实现:

    @ECHO OFF
    
    :: set the params
    SET "ext=flac"
    SET "rootdir=D:\dir_with_flac_files_only"
    SET "todelete=%TEMP%\dirs_to_delete.txt"
    SET "topreserve=%TEMP%\dirs_to_preserve.txt"
    
    :: clear the temp lists
    TYPE NUL >"%todelete%"
    TYPE NUL >"%topreserve%"
    
    :: sort the dirs
    FOR /D /R "%rootdir%" %%D IN (*) DO (
      IF EXIST "%%D\*.%ext%" (
        ECHO %%D>>"%topreserve%"
      ) ELSE (
        ECHO %%D>>"%todelete%"
      )
    )
    
    :: process the sorted lists
    FOR /F "usebackq delims=" %%D IN ("%todelete%") DO (
      FIND "%%D" <"%topreserve%" >NUL || ECHO RD /S /Q "%%D" 2>NUL
    )
    

    您仍然可以在ECHO之前看到RD,但请考虑一下我的说法,'如果我错过了某些内容......'。运行脚本并查看输出。如果它只正确显示了要删除的目录,请删除ECHO并再次运行脚本以继续操作。