如何删除某个深度以下的所有目录?

时间:2019-02-27 01:30:45

标签: batch-file cmd

我正在使用Minecraft Overviewer来生成世界地图,但是,正在生成的目录(和子目录)比我需要的要多得多。层次结构表示quad-tree,缩放级别与其创建这些文件夹的向下级别数量相匹配。

enter image description here

对于您中的询问者,the documentation确实指出您可以在配置文件中设置maxzoom,但是,这是用户界面的限制,而不是实际的限制。如前所述:

  

这不会更改渲染的缩放级别数量,但允许   您忽略上传更大,更详细的缩放级别,如果   带宽使用是个问题。

我需要的是一种删除超过一定深度(例如4级深度)的所有子目录的方法。我知道del用于删除文件,rmdir用于删除目录,并且*被认为是通配符。因此,我认为我可能只需要写...

rmdir */*/*/*

可悲的是,它生成以下错误:Invalid switch - "*",

也许正斜杠存在问题?在这种情况下,我尝试过...

rmdir *\*\*\*

但是,这会产生以下错误:The filename, directory name, or volume label syntax is incorrect

请帮助?

3 个答案:

答案 0 :(得分:2)

尝试此脚本。从当前文件夹开始,它将删除所有级别大于4的文件夹。例如如果您有文件夹1\2\3\4\5\6\7,并且脚本位于文件夹1中,则它将删除从6及以下的文件夹。

@echo off
setlocal enabledelayedexpansion

call :deeptree 0 4
goto :eof

:deeptree
for /d %%p in (*.*) do (
   if %1 lss %2 (
      pushd "%%p"
      set /a l=%1+1
      echo Level !l! %%p
      call :deeptree !l! %2
      popd
   ) else (
      echo removing %%p
      rd /s /q "%%p"
   )
)

答案 1 :(得分:2)

根据我的开场白,您可以使用RoboCopy

@Ren "sourceDir\" "tempName"
@RoboCopy "tempName" "sourceDir" /E /Move /Lev:4

您还可以使用PowerShell来执行此操作,因为它允许您希望使用的通配符模式。

版本3.0 +,(Win8 +)

Get-ChildItem '.\*\*\*\*' -Directory -Recurse | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

…以及别名:

Ls '.\*\*\*\*' -Di -R|Rm -R -Fo -EA SilentlyContinue

版本2.0,(Win7 +)

Get-ChildItem '.\*\*\*\*' -Recurse | Where-Object {$_.PSIsContainer} | Remove-Item -Recurse -Force -ErrorAction SilentlyContinue

…以及别名:

Ls '.\*\*\*\*' -R|?{$_.PSIsContainer}|Rm -R -Fo -EA SilentlyContinue

答案 2 :(得分:1)

您可以简单地嵌套多个for /D loops,如下所示:

for /D %%A in ("D:\Root\Path\Day\*") do (
    for /D %%B in ("%%~A\*") do (
        for /D %%C in ("%%~B\*") do (
            for /D %%D in ("%%~C\*") do (
                for /D %%E in ("%%~D\*") do (
                    rmdir /S /Q "%%~E"
                )
            )
        )
    )
)