16

У меня есть каталог, который содержит миллионы подкаталогов и триллионы файлов. И теперь я должен это очистить. Говоря триллион, я говорю не о размере файла, а о количестве файлов.

Я попытался удалить его с помощью del/s , и с помощью проводника Windows. Никто не может выполнить задачу. Я пытался удалить некоторые из подкаталогов один за другим, и это заняло у меня несколько дней. Проблема, с которой я столкнулся, заключалась в том, что каждый раз, независимо от использования del или Explorer, я вижу в диспетчере задач, что экземпляр explorer потребляет неимоверную память и постепенно приводит к краху моей системы.

Осталось удалить несколько сотен миллионов файлов. Есть ли возможность достичь одной (или несколькими) командами / действиями?


[EDITED]

Я попытался сделать это с Cygwin rm -fr , и дал тот же результат. Суммируется как:

  1. Независимо от того, используете ли вы проводник Windows, команду DEL из командной строки или команду Cygwin rm , системная память постепенно падает до нуля, и в конечном итоге окно падает.

  2. Если в какой-то момент, прежде чем система выйдет из строя, процесс будет закрыт (с помощью сочетания клавиш CTRL+C или чего-либо еще), окно будет продолжать работать в обычном режиме. Однако вся используемая память НЕ будет освобождена. Скажем, я остановил процесс, пока системная память достигает 91%, диспетчер задач сообщает: 4 ГБ ОЗУ всего, кэш-память 329 МБ, а доступно 335 МБ. Тогда использование памяти останется на этом уровне, пока я не перезагружу машину. Если я остановлю экземпляр проводника в диспетчере задач, экран погаснет при включенном индикаторе жесткого диска и больше не вернется. Обычно, когда я останавливаю экземпляр проводника в диспетчере задач, я могу повторно вызвать его, нажав Win+E, или он был перезапущен автоматически.

Ну очень хорошее управление памятью!


[ИЗМЕНИТЬ СНОВА] Кажется, что некоторая часть использованной памяти действительно освободилась через некоторое время, но не все. Некоторая часть кэшированной и доступной памяти вернулась в диспетчере задач. Я больше не ждал, не уверен, что будет потом.

15 ответов15

6

Техническое объяснение

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

Предположим, у вас есть «только» 100 000 000 файлов, и Windows использует простую структуру, подобную этой, для хранения каждого файла вместе с его путем (таким образом вы избегаете хранения каждого каталога по отдельности, тем самым сохраняя некоторые издержки):

struct FILELIST {                   // Total size is 264 to 528 bytes:
  TCHAR         name[MAX_PATH];     // MAX_PATH=260; TCHAR=1 or 2 bytes
  FILELIST*     nextfile;           // Pointers are 4 bytes for 32-bit and 8 for 64-bit
}

В зависимости от того, использует ли он 8-разрядные символы или символы Unicode (он использует Unicode) и является ли ваша система 32-разрядной или 64-разрядной, для хранения списка потребуется от 25 до 49 ГБ памяти (и это очень упрощенная структура).

Причина, по которой Windows пытается перечислить файлы и папки перед их удалением, варьируется в зависимости от метода, который вы используете для их удаления, но это делают и Проводник, и интерпретатор команд (вы можете увидеть задержку при запуске команды). Вы также можете увидеть, как мигает индикатор активности диска (HDD), когда он читает дерево каталогов с диска.

Решение

Лучше всего справляться с подобной ситуацией, используя инструмент удаления, который удаляет файлы и папки по отдельности, по одному за раз. Я не знаю, есть ли какие-нибудь готовые инструменты для этого, но это должно быть возможно сделать с помощью простого пакетного файла.

@echo off
if not [%1]==[] cd /d %1
del /q *
for /d %%i in (*) do call %0 "%%i"

Для этого нужно проверить, был ли передан аргумент. Если это так, то он изменяется на указанный каталог (вы можете запустить его без аргумента, чтобы запустить в текущем каталоге или указать каталог - даже на другом диске, чтобы он начинался там).

Далее он удаляет все файлы в текущем каталоге. В этом режиме, он не должен ничего перечислять и просто удалять файлы, не занимая много, если таковые имеются, памяти.

Затем он перечисляет папки в текущем каталоге и вызывает сам себя, передавая ему (себе) каждую папку для рекурсии вниз.

Анализ

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

Вы можете задуматься об использовании ключа /r вместо (ручной) рекурсии. Это не сработает, потому что, хотя ключ /r выполняет рекурсию, он предварительно перечисляет все дерево каталогов, чего мы и хотим избежать; мы хотим удалить, как мы идем, не отслеживая.

сравнение

Давайте сравним этот метод с методом полного перечисления.

Вы сказали, что у вас есть «миллионы каталогов»; скажем 100 миллионов. Если дерево приблизительно сбалансировано и предполагается, что в среднем около 100 подкаталогов на папку, то самый глубокий вложенный каталог будет примерно на четыре уровня ниже - фактически, во всем дереве будет 101 010 100 подпапок. (Забавно, как 100M может сломаться до 100 и 4.)

Поскольку мы не перечисляем файлы, нам нужно отслеживать не более 100 имен каталогов на уровень, максимум 4 × 100 = 400 каталогов в любой момент времени.

Поэтому требование к памяти должно составлять ~ 206,25 КБ, что находится в пределах любой современной (или иной) системы.

Тестовое задание

К несчастью(?) У меня нет системы с триллионами файлов в миллионах папок, поэтому я не могу ее протестировать (я думаю, по последним подсчетам, у меня было около 800 тыс. Файлов), поэтому кто-то другой должен будет попробовать ее.

Предостережение

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

3

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

Другой вариант - возможно использовать дистрибутив linux на live CD, который может читать из раздела NTFS. Из личного опыта я знаю, что rm -rf folderName может работать не менее 2 дней без сбоя системы с 2 ГБ оперативной памяти. Это займет некоторое время, но по крайней мере это закончится.

3

Эмм .. Я не хочу знать, как ты создал так много.

Происходит следующее: Explorer пытается перечислить каждый файл и сохранить информацию в памяти, прежде чем он начнет удалять. И, очевидно, слишком много.

Вы пробовали команду rmdir /s? Пока он действительно удаляет файлы по мере их обнаружения, а не ожидает перечисления каждого из них, это может работать.

Сколько существует уровней подкаталогов? Если есть только один или какой-то другой низкий номер, то может сработать быстрый пакетный файл, который вручную обрабатывается.

Любой метод займет некоторое время, хотя.

3

Я не могу говорить с триллионами файлов, но недавно я обстрелял старый общий ресурс, который содержал ~ 1,8 млн файлов, используя:

robocopy EmptyTMPFolder FolderToDelete /MIR /MT:16 /ETA /R:30 /W:5

"EmptyTMPFolder" - это пустой локальный каталог. опция /MIR сделает цель похожей на источник (пустой).

Реальным преимуществом для этого подхода была опция повтора (/R:30). Это дало возможность поглотить любые проблемы со связью, которые могут возникнуть во время этого процесса. Локальное удаление может не принести пользу в этом подходе.

У меня нет конкретных тестов для сравнения времени, но я бы предпочел это по сравнению с некоторыми другими вариантами, предложенными b/c из вариантов повтора / ожидания. Удаление началось почти мгновенно.

2

Одной из возможных причин проблемы, подобной этой, является тонкая подготовка, обычно встречающаяся в средах SAN. Некоторые твердотельные накопители могут демонстрировать ту же проблему. Если это так, это изменение конфигурации может решить вашу проблему:

fsutil behavior set DisableDeleteNotify 1

Обратите внимание, что это изменение может повлиять на производительность твердотельных накопителей и может помешать автоматическому и / или ручному переосмыслению накопителей SAN.

2

Shift+Delete пропускает корзину и может значительно ускорить процесс.

Если это не работает (крайние случаи), попробуйте Fast Folder Eraser и / или Mass Directory Eraser

1

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

Вероятно, у вас будет вторая проблема с MFT в NTFS, у которой нет решения, MFT - это массив, который в win 2003 (я не уверен, что у Microsoft есть решение после win 2003) хранит все файлы в пошаговом режиме, поэтому с триллионом файлов размер будет сумасшедшим, в моем случае у MFT было 17 миллионов записей, а размер MFT составлял около 19 ГБ с 45 000 файлами, я тестировал в других системах и, похоже, для 1 миллиона записей MFT будет быть около 1 ГБ.

Вы можете проверить состояние MFT с помощью этой команды:

defrag C: /a /v
  • C: - единичная буква
  • /a - анализировать
  • /v - многословный

Другое хитрое решение, так как не существует инструмента, который может сжимать MFT, инструменты просто заполняют 0 именами файлов и свойств, но не более того, но вы можете использовать конвертер VMware или другой тип P2V и создать виртуальную машину на основе Ваш сервер, таким образом, вы исправите все проблемы, связанные с MFT, я никогда не тестировал конвертацию из V2P, сейчас я работаю только в виртуальных средах, но я видел много информации об этом в Интернете.

Эта win 2003 теперь работает отлично, размер MFT составляет 40 МБ, и все в порядке, если хотите, я могу рассказать вам больше о резервных копиях, дефрагментации или других задачах, связанных с миллионами крошечных файлов.

1

Попробуйте это и измените, как вам нужно ..

Это проверенный скрипт на Win2003, основанный на техническом объяснении и анализе Synetech, ответили 15 октября 13 в 15:22

@echo off

rem ### USE FULL PATH AS FIRST ARGUMENT TO SCRIPT, DONT FORGET QUOTES !
rem ### If you move this script, fix script path variable...
SET STATICFULLSCRIPTPATH="D:\scripts\FOLDER"
SET SCRIPTNAME="DeleteFast.bat"

rem ### If CD fails or IF condition has problems,
rem ### and DEL or RMDIR runs, its better to be at safe place.
if not exist "%TEMP%\SAFE" mkdir "%TEMP%\SAFE"
if exist "%TEMP%\SAFE" cd /d "%TEMP%\SAFE"

rem ### Fix quote overflow
set var1="%1"
set var1=%var1:"=%

if not [%1]==[] (
    cd /d "%var1%"

    echo # KILLING F AT : "%var1%"
    rem ### uncomment to do damage! ### 
    rem # del /f/q * > nul

    for /d %%i in (*) do call "%STATICFULLSCRIPTPATH%\%SCRIPTNAME%" "%var1%\%%i"

    rem ## Finish deleting the last dir
    cd /d "%var1%\.."

echo # KILLING  DIR : "%var1%"
rem ## Remove dir.. first try
rmdir /q "%var1%"

if exist "%var1%" (
    rem ## Remove dir.. second try
    rem ## If thousands of files/dirs had permission/ownership problems, then prepare to wait a long time.
    rem ### uncomment to do damage! ### 
    rem #cmd.exe /c takeown /f "%var1%" && icacls "%var1%" /grant SOMEBODY:F

    rem ### uncomment to do damage! ### 
    rem #rmdir /s/q "%var1%"
)
)

cd /d "%STATICFULLSCRIPTPATH%"

Тестовый забег.. Папки, такие как А1-А4, В1-В4 и С1-С4, вложены по-разному.

Z:\>"D:\scripts\FOLDER\DeleteFast.bat" "D:\scripts\TESTF\DIRS"
# KILLING F AT : "D:\scripts\TESTF\DIRS"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B1\C 1"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B1\C 1"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A1\B2\C 2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B2\C 2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1\B2"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A1"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2\B3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A2\B3\C 3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2\B3\C 3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2\B3"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A2"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3\B4"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A3\B4\C 4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3\B4\C 4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3\B4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A3"
# KILLING F AT : "D:\scripts\TESTF\DIRS\A4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS\A4"
# KILLING  DIR : "D:\scripts\TESTF\DIRS"

D:\scripts\FOLDER>

Я не могу комментировать (сайт жалуется на мою репутацию), поэтому я добавляю свой комментарий здесь ..

Решение Bjv создает бесполезные временные списки файлов. И затем повторяет их во второй раз, чтобы сделать реальную работу. https://superuser.com/a/892412/528695

Оригинальный сценарий Synetech не работал для меня. https://superuser.com/a/416469/528695

@echo off
if not [%1]==[] cd /d %1
echo "%1"
for /d %%i in (*) do call %0 "%%i"

Результаты..

Z:\>C:\privscripts\TESTF\DeleteFastORIGINAL.bat "C:\privscripts\TESTF\DIRS"
""C:\privscripts\TESTF\DIRS""
""A1""
""B1""
""C1""
The system cannot find the path specified.
""B2""
The system cannot find the path specified.
""A2""
The system cannot find the path specified.
""A3""
The system cannot find the path specified.
""A4""

C:\privscripts\TESTF\DIRS\A1\B1\C1>
1

Вероятно, это ваш антивирус / вредоносное ПО, потребляющее всю память и затем сбивающее систему.

У самой Windows нет проблем с удалением огромного количества файлов, хотя она, безусловно, медленнее, чем аналогичная операция в большинстве файловых систем не Microsoft.

1

Пробуя различные подходы для удаления более 10 миллионов файлов журнала Fusion, я заметил, что в среднем около 30 тысяч файлов можно удалить за 10 минут. Это займет около 55 часов для 10 миллионов файлов ...

Используя приведенный ниже скрипт, уровень удаления увеличился на ~ 75%. Списки файлов создаются и выполняются параллельными процессами, увеличивающими дисковые операции (но не линейно). Я показываю 4 вилки, но двух может хватить.

Существует возможность использовать PowerShell, что значительно сокращает время, необходимое для подготовки списков.

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

@ECHO OFF
SETLOCAL EnableDelayedExpansion

IF /I "%~1"=="timestamp" (
    CALL :ECHOTIMESTAMP
    GOTO END
)

rem directory structure to delete
SET "DELETE=c:\_delete\Content.IE5\???<<<change this>>>???"
rem primary list of discovered files to delete
SET "LIST=delete-list.txt"
rem base path for sub-lists
SET "LISTBASE=.\delete-list"
SET "TITLE=Batch Delete Process"
rem specifies number of batch delete processes to spawn
SET FORKS=4
rem when set to 1, use PowerShell for list building and delete.  Definitely improves time to build fork sublists
SET POWERSHELL=0
rem specifies max files to delete when greater than 0
SET MAXDEL=1000000

rem prompt for confirmatoin
SET /P CONT=About to delete all files and directories from !DELETE!. Continue (Y/N)?
IF /I NOT "!CONT!"=="Y" EXIT /B

CALL :ECHOTIMESTAMP

ECHO Accumulating list of files to delete...
dir /b /s "!DELETE!" > "!LIST!"

FOR /F "delims=" %%c IN ('type "!LIST!" ^| find /C ":"') DO SET "COUNT=%%c"
ECHO Discoverd !COUNT! files and directories to delete.

IF  %MAXDEL% GTR 0 IF !COUNT! GTR %MAXDEL% (
    SET COUNT=%MAXDEL%
    ECHO Limiting files/directories deletion count to  !COUNT!
)

CALL :ECHOTIMESTAMP
ECHO Preparing !FORKS! delete processes...
SET /A LIMIT=!COUNT!/!FORKS!

IF !POWERSHELL! EQU 1 (
    SET SKIP=0
    FOR /L %%n IN (1,1,!FORKS!) DO (
        SET "CURRENT=!LISTBASE!-%%n.txt"
        SET "LIST[%%n]=!CURRENT!"
        DEL /f /q "!CURRENT!" > nul 2>&1
        IF %%n EQU !FORKS! SET /A LIMIT+=!FORKS!
        SET CMD=type \"!LIST!\" ^| select -first !LIMIT! -skip !SKIP!
        powershell -command "& {!CMD!}" > "!CURRENT!"
        SET /A SKIP+=!LIMIT!
    )

) ELSE (
    rem significantly slower but no PowerShell.
    SET L=1
    SET N=!LIMIT!
    SET C=0
    FOR /F %%f  IN (!LIST!) DO (
        IF !C! LSS !COUNT! (
            IF !N! GEQ !LIMIT! (
                SET "CURRENT=!LISTBASE!-!L!.txt"
                SET "LIST[!L!]=!CURRENT!"
                DEL /f /q "!CURRENT!" > nul 2>&1
                SET /A L+=1
                SET /A N=0
            ) ELSE (
                SET /A N+=1
            )
            ECHO %%f >> "!CURRENT!"
        ) ELSE (
            GOTO ENDLIST
        )
        SET /A C+=1
    )
)
:ENDLIST

CALL :ECHOTIMESTAMP
ECHO Forking !FORKS! delete processes...
FOR /L %%t IN (1,1,!FORKS!) DO (

    SET "CURRENT=!LIST[%%t]!"
    IF !POWERSHELL! EQU 1 (
        SET "TAB=        "
        SET BLANK=!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!!TAB!
        SET BLANK=!BLANK!!BLANK!!BLANK!!BLANK!
        SET DEL_CMD=del -force -recurse -ea SilentlyContinue -path \"$_\"
        SET $W_CMD=$w=$Host.UI.RawUI.WindowSize.Width
        SET $S_CMD=$s=\"$_\";$i=[math]::max^(0,$s.length-$w^);$s=$s.substring^($i, $s.length-$i^);$s=\"$s !BLANK!\";$s=$s.substring^(0,[math]::min($w,$s.length^)^)
        SET ECHO_CMD=Write-Host \"`r$s\" -NoNewLine
        SET CMD=type \"!CURRENT!\" ^| %% {!DEL_CMD!; !$W_CMD!; !$S_CMD!; !ECHO_CMD!}
        SET CMD=powershell -command "^& {!CMD!}" ^& ECHO\ ^& "%~dpnx0" timestamp
        ECHO CMD !CMD!
    ) ELSE (
        SET LOOP=FOR /F %%%f IN ^(!CURRENT!^) DO
        SET OP=del "%%%f"
        SET CMD=@ECHO OFF ^&^& ^(!LOOP! !OP!  ^> nul 2^>^&1 ^)  ^& "%~dpnx0" timestamp
    )
    rem ECHO !CMD!
    START "!TITLE! %%t" cmd /k  !CMD!
)

GOTO END

:ECHOTIMESTAMP
SETLOCAL
    SET DATESTAMP=!DATE:~10,4!-!DATE:~4,2!-!DATE:~7,2!
    SET TIMESTAMP=!TIME:~0,2!-!TIME:~3,2!-!TIME:~6,2!
    ECHO !DATESTAMP: =0!-!TIMESTAMP: =0!
ENDLOCAL
GOTO :EOF

:END
ENDLOCAL
EXIT /B
0

Поскольку одновременное удаление файлов занимает слишком много памяти, вам нужен способ их удаления по одному, но с автоматизированным процессом. Подобные вещи намного проще сделать в оболочке в стиле Unix, поэтому давайте использовать Cygwin. Следующая команда генерирует список обычных файлов, преобразует этот список в последовательность команд rm , а затем передает полученный сценарий в оболочку.

 find dir \! -type d | sed 's/^/rm /' | sh

Сценарий выполняется даже во время его генерации, и в нем нет циклов, поэтому оболочке (надеюсь) не нужно создавать большие временные файлы. Это, безусловно, займет некоторое время, поскольку длина сценария составляет миллионы строк. Возможно, вам придется настроить команду rm (возможно, мне следовало использовать -f? но ты понимаешь свои файлы лучше меня) чтобы заставить его работать.

Теперь у вас ничего не осталось, кроме каталогов. Вот где вещи становятся дикими. Возможно, вы удалили достаточно файлов, чтобы вы могли выполнить rm -rf без нехватки памяти (и, вероятно, это будет быстрее, чем другой скрипт). Если нет, мы можем адаптировать ответ Stackoverflow:

 find dir | perl -lne 'print tr:/::, " $_"' | sort -n | cut -d' ' -f2 | sed 's/^/rmdir /' | sh

Опять же, может потребоваться настройка, на этот раз с sort , чтобы избежать создания огромных временных файлов.

0

Проблема, с которой вы можете столкнуться, заключается в том, что каталог не уплотняется при удалении файла / папки, поэтому, если у вас есть папка с 1 миллионом файлов в ней, и удалите первые 500 КБ из них. В начале вашего каталога есть тонна блоков, которые, по сути, пустые.

НО, explorer и командная строка по-прежнему должны просматривать эти блоки на случай, если там есть файл. Что-то, что может помочь, - это "переместить" папку из какого-то места вниз по дереву в новую папку у основания диска, а затем удалить эту новую папку. Перемещение папки приведет только к перемещению указателя на папку, поэтому она должна двигаться быстро, а не перемещать все файлы в ней на новое место на диске.

Еще одна вещь, которую вы можете попробовать, - это использовать сторонние инструменты, такие как "PerfectDisk", для сжатия папок после удаления нескольких файлов.

0

Я обнаружил, что этот поток ищет лучший способ удаления более 3 миллионов файлов на нескольких серверах, которые я поддерживаю. Вышесказанное является слишком сложным IMO, поэтому я использовал известный мне метод использования инструмента командной строки "FORFILES" в Windows (это было на Server 2003).

В любом случае, ниже приведена команда FORFILES, которую я использовал для удаления ВСЕХ файлов в папке из командной строки.

forfiles /P "ПУТЬ ВАШЕЙ ПАПКИ ЗДЕСЬ (например, C:\Windows\Temp)" /C "cmd /c echo @file & del /f /q @file"

Выше также ECHO - это имя файлов, которые удаляются на экран, но только потому, что я хотел увидеть некоторый прогресс в том, что он на самом деле что-то делает, если вы не выводите что-то, это просто выглядит, как окно DOS зависло, даже хотя он делает работу хорошо, как и ожидалось.

Инициирование занимает некоторое время, то есть похоже, что какое-то время ничего не происходит (около 30 м для ~ 3 млн. Файлов), но в конечном итоге вы должны увидеть, что имена файлов начинают появляться по мере их удаления. Этот метод также занимает много времени для удаления файлов (время удаления может быть сокращено без эха?), Но в конечном итоге он работает без сбоя машины, на моих файловых серверах использовалось ~ 1850 КБ памяти во время процесса удаления. ,

Продолжительность удаления может вызвать проблему, если на ваших серверах есть автоматический выход из системы, поскольку вам нужно держать мышь движущейся (я бы порекомендовал работать как пользователь консоли, или с помощью инструмента третьей части, такого как LanDesk или SCCM и т.д. (Или MouseJiggle). EXE))

Во всяком случае, думал, что я поделюсь своим ответом, удачи всем!

0

Для этого ответа на StackOverflow используйте комбинацию del и rmdir:

del /f/s/q foldername > nul
rmdir /s/q foldername
0

Я столкнулся с той же проблемой некоторое время назад. Я написал небольшую утилиту, которая делает именно это: рекурсивно удаляет каталог. Он не будет перечислять файлы и не будет занимать много памяти (O (n+m) на максимуме с n = максимальной глубиной каталога и m = максимальным количеством файлов / каталогов в одном из подкаталогов). Он может обрабатывать длинные пути к файлам (> 256 символов). Я хотел бы получить обратную связь, если вы можете решить эту проблему с этим.

Вы можете найти его здесь: https://github.com/McNetic/fdeltree (исполняемый файл в папке релизов)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .