我仍然不确定至于在决定删除它之前要在目录上执行哪种测试 - “某个文件类型是否存在”或“某个文件类型是否不存在”。你的帖子似乎表明它是后者,所以它必须是误导性的标题。为了这个答案的目的,我假设它确实是“某个文件类型是否存在”测试你想要的。
这里是一个非常简单的,不事张扬的方法解决问题:
@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)如果在其他列表中找不到,请将其删除。
(如果你想知道:从第一个列表中的目录可能确实在第二列表中找到它的子目录的路径部分。)
我完全不相信这是最好的方法,但至少它应该能够工作(无论如何它对我都有效)。下面是我实现的是:
@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
)
你仍然可以看到RD
前ECHO
,但考虑到它只是我的方式说,“如果我错过了什么......”。运行脚本并查看输出。如果它只能正确显示将要删除的目录,请删除ECHO
并再次运行该脚本以继续操作。
不明白“删除文件夹JAZZ,因为.ape是FLAC文件夹的错误文件类型”。你能更详细地解释一下更多的例子吗? – adarshr 2012-04-04 14:12:53
你在该文件夹中只有'.ape'文件,对吧? – 2012-04-04 14:13:09
它也可以是C++吗? – ComFreek 2012-04-04 14:14:08