Как удалить огромное количество файлов в Windows

22

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

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

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


[Изменено]

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

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

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

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


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

Джеки Чунг
источник
Итак, ваша главная проблема в том, что каталоги и подкаталоги не удаляются?
Сандип Бансал
@Jackey Cheung: какую версию windows вы используете?
Шива Чаран
1
Вы можете написать пакетный скрипт, который рекурсивно удаляет файлы, не начиная с верхнего уровня, а, например, на пятом уровне структуры папок. Это разделило бы работу на множество отдельных и последовательных 'rm's'
9
Я должен знать, как, черт возьми, вы получили триллион файлов, на самом деле ...
Моав
2
Триллиону файлов нужна таблица файлов размером 1 ПБ. Самые большие жесткие диски в настоящее время - несколько ТБ. Как вы могли получить такой большой раздел?
user541686 15.10.13

Ответы:

10

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

Причина, по которой большинство методов вызывают проблемы, заключается в том, что 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 КБ файлов), поэтому кому-то еще придется попробовать Это.

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

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

Synetech
источник
Я почти уверен, что это не сработает. Я попробовал это. Проблема заключается в цикле FOR. Оказалось, что FOR вызовет ту же проблему, что и выдача DEL напрямую.
Джеки Чунг
1
Это зависит от используемых вами переключателей. Если вы использовали /rпереключатель, то, как я объяснил, он попытается перечислить все файлы. Если вы используете /dпереключатель, он перечисляет только папки в текущем каталоге, поэтому, если у вас нет миллиарда папок в текущем каталоге, это не должно вызывать проблем.
Synetech
7

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

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

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

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

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

matt.bungard
источник
Я обнаружил, что это самый эффективный метод при выполнении очистки в дереве папок большого сетевого диска. Спасибо за совет.
Тонни
5

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

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

soandos
источник
1
хм, линукс. Я думаю о Cygwin. Хотя предполагается использовать подчеркивающие функции Windows, просто интересно, будет ли это иметь значение в этом случае. Я попробую это.
Джеки Чунг
1
Вы можете использовать git bash
raindrop
4

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

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

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

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

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

боб
источник
Помимо предложения Соандоса о переформатировании, конечно. Это было бы быстро, но если это ваш системный диск, вам придется переустановить Windows.
Боб
Я почти уверен, что перечисление должно иметь место, просто чтобы программа знала, что удалять дальше. rmdir не может удалять файлы по мере их обнаружения, так как он начинается сверху и должен каким-то образом проходить. Вопрос только в том, сколько избыточной информации он хранит.
Soandos
@soandos Explorer считает каждый файл. Я думал о каком-то методе, который реализует стиль перечисления DFS: идти как можно дальше вниз по ветке, удаляя при попадании в файл, прежде чем вернуться обратно. Другими словами, рекурсия, это то, что rm -rfделает. Это лучше всего работает с относительно мелкими структурами каталогов. Я не уверен, если rmdir /sэто делает. Он должен .
Боб
1
@JackeyCheung rmdir /?: /s Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.Другими словами, /sфлаг также удаляет файлы. Как ты использовал del? И да, может быть, лучше просто использовать, rm -rfкак предложил Соандос.
Боб
1
@JackeyCheung: ты не прав. Если вы дадите rmdir флаг / s, он удалит файлы и каталоги.
Гарри Джонстон
4

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

fsutil behavior set DisableDeleteNotify 1

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

Гарри Джонстон
источник
3

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

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

Тамара Вийсман
источник
когда я пытался удалить огромное количество файлов изображений, да, Shift DEL довольно быстрый по сравнению с обычным DEL, спасибо
V-SHY
3

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

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

Бен Фойгт
источник
Отличный момент! Конечно стоит посмотреть.
Джеки Чунг
Я отключил антивирус, и память все еще была съедена, как и раньше.
Джеки Чунг
Отключение антивируса также не освобождает память после остановки процесса.
Джеки Чунг
@JackeyCheung: Какая антивирусная программа? Некоторые на самом деле не выключаются полностью ...
Бен Фойгт
2

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

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

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

Келли
источник
2

Пробуя различные подходы для удаления более 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
bvj
источник
2

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

Это проверенный скрипт на 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%"

Testrun .. Есть папки, такие как А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 создает бесполезные временные списки файлов. И затем повторяет их во второй раз, чтобы сделать реальную работу. /superuser//a/892412/528695

Оригинальный сценарий Synetech не работал для меня. /superuser//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>
Е.О.
источник
Я могу убедиться, что @ user4350129 является правильным, когда он говорит, что скрипт Synetech не работает - у меня такое же поведение на моем Win7x64 коробке.
leinad13
Черт, мой сценарий тоже не был идеальным, проблемы с отсутствием аргументов arg и переполнением кавычек прервали выполнение команд anc icacls ... также я проверял только папки, а не файлы .. Я исправил эти проблемы ... пост-отредактировал, но всегда проверял перед использованием.
EO
2

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

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

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

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

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

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

user5286776117878
источник
1

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

del /f/s/q foldername > nul
rmdir /s/q foldername
Geoff
источник
Да, я читал это раньше. На самом деле это не помогает в моем случае. Так как команда del вылетает определенно.
Джеки Чунг
1

Поскольку одновременное удаление файлов занимает слишком много памяти, вам нужен способ их удаления по одному, но с автоматизированным процессом. Такого рода вещи намного проще сделать в оболочке в стиле 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, чтобы избежать создания огромных временных файлов.

Исаак Рабинович
источник
1

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

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

Николай Эхеманн
источник
1

Я обнаружил, что этот поток ищет лучший способ удаления более 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). исполняемый файл))

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

RatMonkey
источник