2012-04-04 38 views
1

我是新来的董事会,所以请放轻松! :)当在其中找到文件扩展名时删除文件夹和子目录

基本上,我正在写一个批处理文件来删除文件夹,有一个在其中具有某种扩展类型的文件。

因此,例如,如果我有以下文件夹

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

我需要一点点的代码,可以删除该文件夹JAZZ因为.ape对于FLAC文件夹中的错误的文件类型。

任何帮助将是真棒家伙,我已经试过的findstrexist变种和写入文本文件,并试图读取使用路径dir /s /b

我迷路

+0

不明白“删除文件夹JAZZ,因为.ape是FLAC文件夹的错误文件类型”。你能更详细地解释一下更多的例子吗? – adarshr 2012-04-04 14:12:53

+0

你在该文件夹中只有'.ape'文件,对吧? – 2012-04-04 14:13:09

+0

它也可以是C++吗? – ComFreek 2012-04-04 14:14:08

回答

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" 
) 

也就是说,只是遍历目录树和,对于每一个子目录,检查,如果它不包含必要的文件。如果没有,就说再见。 (为了安全起见,我在RD命令前加ECHO,所以它确实说了再见但不执行的实际行动,以防万一你冲进执行脚本没有进一步阅读。)

这种方法然而,这是错误的。即使一个目录可能不包含所需的文件,它的目录可能也是如此,并且这个脚本不能验证这个事实。因此,你可能会失去一些无价的FLAC文件。 (我刚刚救了你的悲痛。)

所以,这里需要更详细的内容。我想出的方法包括以下步骤:

  1. 分类目录分为两类:那些包含必要的扩展名的文件和那些不这样做。

  2. 过程不包含这些文件的目录列表:如果一个目录中的其他列表中找到

    1),忽略它;

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

(如果你想知道:从第一个列表中的目录可能确实在第二列表中找到它的子目录的路径部分。)

我完全不相信这是最好的方法,但至少它应该能够工作(无论如何它对我都有效)。下面是我实现的是:

@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 
) 

你仍然可以看到RDECHO,但考虑到它只是我的方式说,“如果我错过了什么......”。运行脚本并查看输出。如果它只能正确显示将要删除的目录,请删除ECHO并再次运行该脚本以继续操作。

相关问题