Как удалить все каталоги ниже определенной глубины? - PullRequest
0 голосов
/ 27 февраля 2019

Я использую Minecraft Overviewer для создания карты мира, однако создается гораздо больше каталогов (и подкаталогов), чем мне нужно.Иерархия представляет собой четырехугольное дерево , а уровни масштабирования соответствуют количеству уровней, по которым создаются эти папки.

enter image description here

Для любознательных из вас документация действительно указывает, что вы можете установить maxzoom в файле конфигурации, однако это ограничение пользовательского интерфейса, а не практическое.Как отмечено:

Это не меняет количество отображаемых уровней масштабирования, но позволяет пренебречь загрузкой более крупных и подробных уровней масштабирования, если использование полосы пропускания является проблемой.

Мне нужен способ удалить все подкаталоги за определенной глубиной (скажем, 4 уровня).Я знаю, что del для удаления файлов, rmdir для удаления каталогов, и что * считается символом подстановки.Поэтому я предположил, что мне, возможно, просто нужно написать ...

rmdir */*/*/*

К сожалению, он генерирует следующую ошибку: Invalid switch - "*",

Возможно, возникла проблема с косой чертой?В этом случае я попытался ...

rmdir *\*\*\*

Однако, это привело к следующей ошибке: The filename, directory name, or volume label syntax is incorrect

Пожалуйста, помогите?

Ответы [ 3 ]

0 голосов
/ 27 февраля 2019

Вы можете просто вложить несколько for /D петель , например:

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"
                )
            )
        )
    )
)
0 голосов
/ 27 февраля 2019

Согласно моему вступительному комментарию, вы могли бы использовать 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
0 голосов
/ 27 февраля 2019

Попробуйте этот скрипт.Он удалит все папки с уровнем более 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"
   )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...