Як видалити величезну кількість файлів у Windows


22

У мене є каталог, який містить мільйони підкаталогів і трильйони файлів. І тепер я маю це очистити. Говорячи про трильйон, я кажу не про розмір файлу, а про кількість файлів.

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

Є ще кілька сотень мільйонів файлів, які потрібно видалити. Чи є можливість досягти однієї (або лише декількох) команд / дій?


[ЗДОРОВО]

Я спробував це зробити з Cygwin rm -fr, і дав той же результат. Узагальнено як:

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

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

Ну, справді приємне управління пам’яттю!


[РЕДАКТУЙТЕ ПРОТИ] Здається, що частина використаної пам'яті звільнилася через довгий час, але не всі. Деяка частина кешованої та доступної пам’яті повернулася в диспетчер завдань. Я більше не чекав, не знаю, що буде потім.


Отже, ваша основна проблема полягає в тому, що каталоги та підкаталоги не видаляються?
Сандіп Бансал

@Jackey Cheung: яку версію Windows ви використовуєте?
Сіва Чаран

1
Ви можете написати пакетний сценарій, який рекурсорно видаляє файли, починаючи не з верхнього рівня, а, наприклад, з п'ятого рівня структури папки. Це розділило б роботу на багато окремих та послідовних 'rm's

9
Я мушу знати, як, на біса, ти отримав трильйон файлів, насправді ...
Моаб,

2
Для трильйона файлів потрібна таблиця файлів, що становить 1 PB. На сьогодні найбільшими жорсткими дисками є кілька туберкульозу. Як ви, можливо, отримали такий великий розділ?
користувач541686

Відповіді:


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 підпапок. (Забавно, як 100 М може розбитись до всього 100 і 4.)

Оскільки ми не перераховуємо файли, нам потрібно лише відслідковувати щонайменше 100 імен каталогів на рівні, максимум 4 × 100 = 400каталогів у будь-який момент часу.

Тому потреба в пам'яті повинна становити ~ 206,25 КБ, що знаходиться в межах будь-якої сучасної (або іншої) системи.

Тест

На жаль (?) У мене немає системи з трильйонами файлів у мільйонах папок, тому я не в змозі перевірити це (я вважаю, що в останньому підрахунку, у мене було близько ~ 800 К файлів), тому хтось інший повинен буде спробувати це.

Caveat

Звичайно, пам'ять - не єдине обмеження. Диск теж буде великим вузьким місцем, тому що для кожного видаленого файлу та папки система повинна позначати його як безкоштовний. На щастя, багато з цих дискових операцій будуть поєднані разом (кешовані) та виписані фрагментами, а не окремо (принаймні для жорстких дисків, а не для знімних носіїв), але це все одно спричинить трохи збивання, як читає система і записує дані.


Я впевнений, що це не працює. Я спробував це. Проблема полягає в циклі FOR. Виявилося, що FOR спричинить ту ж проблему, що і видача DEL безпосередньо.
Jackey Cheung

1
Це залежить від перемикачів, які ви використовуєте. Якщо ви використовували /rкомутатор, то, як я пояснив, він спробує перерахувати всі файли. Якщо ви використовуєте /dкомутатор, він лише перераховує папки в поточному каталозі, тому, якщо у поточному каталозі у вас мільярд папок, це не повинно викликати проблем.
Synetech

7

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

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

"EmptyTMPFolder" - порожній локальний каталог. опція / MIR зробить ціль схожим на джерело (порожнє).

Справжньою користю для цього підходу був варіант повторного спроби (/ R: 30). Це дозволило поглинати будь-які проблеми з підключенням, які можуть виникнути під час цього процесу. Місцеві делети можуть не знайти користі в такому підході.

У мене немає конкретних орієнтирів для порівняння часу, але я вважаю за краще це порівняно з іншими запропонованими варіантами b / c варіантів повторного / очікування. Делети почалися майже миттєво.


Я виявив, що це далеко не найефективніший метод під час очищення на великому дереві папок мережевого диска. Дякую за пораду.
Тонні

5

Щоб видалити всі папки, буде потрібно багато часу, і ви не можете цього зробити багато. Що ви можете зробити - це зберегти свої дані та відформатувати диск. Це не оптимально, але він спрацює (і швидко).

Інший варіант - можливо, використовувати деякий дистрибутив Linux на прямому компакт-диску, який може читати з розділу NTFS. Я знаю з особистого досвіду, що rm -rf folderNameможе працювати мінімум 2 дні без збоїв системи з 2 Гб оперативної пам’яті. Пройде деякий час, але принаймні закінчиться.


1
хм, Linux. Я думаю про сиґвіну. Хоча варто використовувати підкреслені функції Windows, просто цікаво, чи це змінить справу у цьому випадку. Я спробую це спробувати.
Jackey Cheung

1
ви можете використовувати git bash
краплі дощу

4

Ем .. Я не хочу знати, як ти створила стільки.

Що відбувається - Explorer намагається перерахувати кожен окремий файл і зберігати інформацію в пам'яті, перш ніж він почне видалення. І очевидно, що занадто багато.

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

Скільки існує рівнів підкаталогів? Якщо є лише одне чи якесь інше низьке число, може працювати швидкий пакетний файл, який вручну повторюється.

Однак будь-який метод потребує певного часу.


Окрім пропозиції soandos про переформатування, звичайно. Це було б швидко, але якщо це ваш системний диск, вам доведеться перевстановити 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пропускає кошик і може значно пришвидшити роботи.

Якщо це не спрацює (надзвичайні випадки), спробуйте швидку гумку папок та / або гумку Mass Directory


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

3

Ймовірно, ваш антивірус / антивірус витрачає всю пам'ять, а потім виходить з ладу системою.

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


Приємна точка! Звичайно варто подивитися.
Jackey Cheung

Я вимкнув антивірус, і пам'ять все-таки поїла, як і раніше.
Жакей Чен

Відключення антивірусу також не допомагає звільнити пам’ять після зупинки процесу.
Jackey Cheung

@JackeyCheung: Яка антивірусна програма? Деякі фактично не вимикаються повністю ...
Бен Войгт

2

Проблема, з якою ви можете зіткнутися, полягає в тому, що при видаленні файлу / папки каталог не ущільнюється, тому, якщо у вас є папка з 1 мільйоном файлів, ви видалите перші 500 000 з них. На початку Вашого каталогу є тонна блоків, які для всіх намірів порожні.

Але НЕ, провідник і командний рядок все ще повинен переглядати ці блоки на випадок, якщо там є файл. Щось, що може допомогти, - це "перемістити" папку з куди-небудь дерева в нову папку з основи диска, а потім видалити цю нову папку. Переміщення папки перемістить лише вказівник на папку, тому вона повинна швидко пройти, а фактично не перемістити всі файли під нею до нового місця на диску.

Інша річ, яку ви можете спробувати, - це використовувати сторонній інструмент на зразок "PerfectDisk" для компактних папок після видалення купи файлів.


2

Спробуючи різні підходи до видалення понад 10 мільйонів файлів журналу синтезу, я помітив, що близько 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

2

Спробуйте це та змініть, як вам потрібно.

Це перевірений сценарій Win2003, заснований на технічному поясненні та аналізі Synetech, відповів 15 жовтня 1313 о 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 .. Є папки, як від A1 до A4, B1 до B4 і від C1 до C4, які вкладені по-різному.

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

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

Цей виграш 2003 року працює зараз ідеально, розмір MFT становить 40 Мб, і все в порядку, якщо ви хочете, я можу розповісти вам більше про завдання резервного копіювання, дефрагменти чи інші завдання, пов'язані з мільйонами крихітних файлів.



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) при max з n = максимальна глибина каталогу та m = максимальна кількість файлів / директорій в одному з підкаталогів). Він може обробляти довгі файлові шляхи (> 256 символів). Я хотів би отримати зворотній зв'язок, якщо ви зможете вирішити свою проблему з цим.

Ви можете знайти його тут: https://github.com/McNetic/fdeltree (виконується у папці випусків)


1

Я виявив, що цей потік шукає кращий спосіб, ніж я був для видалення понад 3 мільйонів файлів на декількох серверах, які я підтримую. Наведене вище є складним IMO, тому я в кінцевому підсумку використовував відомий метод використання інструменту командного рядка "FORFILES" у Windows (це було на сервері 2003).

У будь-якому випадку, нижче - команда FORFILES, яку я використовував для видалення ВСІХ файлів у папці з командного рядка.

forfiles / P "ВАША СТОРІНКА папки ТУТ (наприклад, C: \ Windows \ Temp)" / C "cmd / c echo @file & del / f / q @file"

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

Ініціювати потрібно небагато часу, тобто виглядає так, що він деякий час нічого не робить (приблизно 30м для ~ 3млн. Файлів), але зрештою ви повинні побачити, що імена файлів починають з'являтися, коли вони видаляються. Цей метод також потребує тривалого часу для видалення файлів (час видалення може бути скорочено без відлуння?), Але він врешті-решт працює без збоїв машини, на моїх серверних файлах було використано ~ 1850 Кб пам'яті під час видалення. .

Тривалість видалення може спричинити проблему, якщо ваші сервери мають автоматичний вихід з системи, як вам потрібно, щоб миша рухалася (я б рекомендував працювати як користувач консолі, або через інструмент 3-ї частини, наприклад LanDesk або SCCM тощо) (або MouseJiggle. exe))

У всякому разі, думав, що поділюсь своєю відповіддю, удачі всім!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.