如何删除不包含特定类型文件的目录的子目录?

时间:2017-01-08 07:53:28

标签: batch-file directory

如何删除主目录中不包含扩展名为.flac .mp3 .m4a的文件的所有目录?

许多需要删除的目录不为空,但不包含这些文件。

3 个答案:

答案 0 :(得分:1)

我们假设文件夹C:\Temp\Test包含以下非隐藏子文件夹和这些子文件夹中的文件:

  • 文件夹1
    • 文件1.txt
  • 文件夹2
    • 文件2.mp3
  • 文件夹3
    • 档案3.m4a
  • 文件夹4
  • 文件夹5
    • 文件5.tmp
    • 文件5.doc

用于处理C:\Temp\Test

的5个子文件夹的批处理文件
@echo off
for /D %%D in ("C:\Temp\Test\*") do call :CheckFolder "%%D"
goto :EOF

:CheckFolder
for %%I in (flac mp3 m4a) do (
    if exist "%~1\*.%%I" (
        echo Folder %1 contains *.%%I file.
        goto :EOF
    )
)
echo Delete folder %1
echo rd /Q /S %1
goto :EOF

批处理文件生成输出:

Delete folder "C:\Temp\Test\Folder 1"
rd /Q /S "C:\Temp\Test\Folder 1"
Folder "C:\Temp\Test\Folder 2" contains *.mp3 file.
Folder "C:\Temp\Test\Folder 3" contains *.m4a file.
Delete folder "C:\Temp\Test\Folder 4"
rd /Q /S "C:\Temp\Test\Folder 4"
Delete folder "C:\Temp\Test\Folder 5"
rd /Q /S "C:\Temp\Test\Folder 5"

看起来批处理文件按预期工作。因此,下一步是从最后一行删除echo以真正执行命令 RD 删除文件夹。批量输出现在是:

Delete folder "C:\Temp\Test\Folder 1"
Folder "C:\Temp\Test\Folder 2" contains *.mp3 file.
Folder "C:\Temp\Test\Folder 3" contains *.m4a file.
Delete folder "C:\Temp\Test\Folder 4"
Delete folder "C:\Temp\Test\Folder 5"

文件夹C:\Temp\Test现在仅包含:

  • 文件夹2
    • 文件2.mp3
  • 文件夹3
    • 档案3.m4a

完成任务。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • call /?
  • echo /?
  • for /?
  • goto /?
  • if /?
  • rd /?

答案 1 :(得分:1)

我会使用两个嵌套的for循环,其中外部循环遍历目录,内部循环遍历文件类型。内部仅在至少一个预定义类型之一的文件的情况下迭代,在这种情况下设置标志变量;在内部循环之后,检查该标志,并有条件地完成目录删除:

for /D %%D in ("D:\root\*") do (
    set "FLAG="
    pushd "%%~D"
    for %%F in ("*.flac" "*.mp3" "*.m4a") do set "FLAG=#"
    popd
    if not defined FLAG rmdir /S /Q "%%~D"
)

答案 2 :(得分:0)

这是一个奇怪的替代方案。

如果是您的具体问题,请确保分别在第3行和第4行的两个变量中输入您选择的父目录和所需的扩展名。

@Echo Off
SetLocal EnableDelayedExpansion
Set "ParD=C:\Users\blazin8s\Main Directory"
Set "Exts=*.flac *.mp3 *.m4a"
For /D %%A In ("%ParD%\*") Do Call :Sub "%%~fA"
Timeout -1
Exit/B

:Sub
Set "i=0"
For /F "Tokens=1-3" %%A In ('RoboCopy %1 Null /E /LEV:1 /NFL /NDL /NJH /L %Exts%
') Do If %%B==: (Set/A "i+=1"
        If !i! Equ 2 If %%C Equ 0 Echo=RD/S/Q %1)
  • 以上内容也可以更改,首先在第11行(可选)上将/E更改为/S,然后:

    将第13行的第二个Equ更改为Gtr,以删除仅包含任何指定扩展名的目录。然后,您可以通过进一步将RD/S/Q更改为Move来仅移动包含任何指定扩展名的目录。

    您甚至可以将原始发布的第13行从0更改为4,以删除包含与您指定的任何扩展名相匹配的4个文件的目录。

注意 - 在所有情况下,脚本只会向您显示会发生什么。如果您对该输出感到满意,请从第13行移除Echo=,然后从第6行或第6行全部删除-