Windows에서 많은 수의 파일을 삭제하는 방법


22

수백만 개의 하위 디렉토리와 수조 개의 파일이 포함 된 디렉토리가 있습니다. 그리고 지금 그것을 정리해야합니다. 1 조 달러라고 말하면 파일 크기가 아니라 파일 수에 대해 이야기하고 있습니다.

로 삭제하고 del/sWindows 탐색기를 사용해 보았습니다 . 어느 쪽도 작업을 완료 할 수 없습니다. 하위 디렉토리 중 일부를 하나씩 삭제하려고 시도했는데 며칠이 걸렸습니다. 내가 만난 문제 del는 작업 관리자에서 탐색기를 사용하더라도 탐색기 인스턴스가 하늘 메모리를 많이 소비하고 점차 시스템이 다운된다는 것을 작업 관리자에서 볼 수 있다는 것입니다.

여전히 삭제 될 약 1 억 개의 파일이 있습니다. 하나의 (또는 몇 개의) 명령 / 행동으로 달성 할 가능성이 있습니까?


[편집 됨]

Cygwin으로 시도했지만 rm -fr동일한 결과를 얻었습니다. 다음과 같이 요약됩니다 :

  1. Windows 탐색기, DEL명령 프롬프트 또는 Cygwin rm명령을 사용하더라도 시스템 메모리는 점차적으로 0으로 떨어지고 결국 상자가 충돌합니다.

  2. 어느 시점에서든 시스템 장애가 발생하기 전에 프로세스가 닫히면 (Ctrl + C 또는 기타 방법으로) 상자가 정상적으로 작동합니다. 그러나 사용 된 모든 메모리가 해제되지는 않습니다. 시스템 메모리가 91 %에 도달하는 동안 프로세스를 중지했다고 작업 관리자가 말합니다 : 총 4G RAM, 캐시는 329M, 사용 가능한 335MB. 그런 다음 컴퓨터를 재부팅 할 때까지 메모리 사용량 이이 수준을 유지합니다. 작업 관리자에서 탐색기 인스턴스를 중지하면 HDD 표시등이 항상 켜져 있고 화면이 다시 나타나지 않습니다. 일반적으로 작업 관리자에서 탐색기 인스턴스를 중지하면 Win + E를 눌러 다시 인스턴스를 호출하거나 자동으로 다시 시작됩니다.

글쎄, 정말 좋은 메모리 관리!


[다시 편집] 사용 된 메모리 중 일부가 오랫동안 해제 된 것으로 보이지만 전부는 아닙니다. 캐시 및 사용 가능한 메모리 중 일부가 작업 관리자로 돌아 왔습니다. 더 이상 기다리지 않았습니다. 그때 어떻게 될지 잘 모르겠습니다.


따라서 주된 문제는 디렉토리와 하위 디렉토리가 삭제되지 않는다는 사실입니다.
Sandeep Bansal

@Jackey Cheung : 사용중인 Windows 버전은 무엇입니까?
Siva Charan

1
최상위부터 시작하여 폴더 구조의 다섯 번째 레벨과 같이 파일을 반복적으로 삭제하는 배치 스크립트를 작성할 수 있습니다. 그것은 작업을 여러 개의 개별적이고 순차적 인 'rm'으로 나눌 것입니다

9
나도 어떻게해야하는지, 어떻게 1 조 파일을 얻었 는가?
Moab

2
1 조 개 파일에는 1 PB 인 파일 테이블이 필요합니다. 오늘날 가장 큰 하드 디스크는 몇 TB입니다. 어떻게 큰 파티션을 얻었습니까?
user541686

답변:


10

기술 설명

대부분의 방법으로 문제가 발생하는 이유는 Windows가 파일과 폴더를 열거하려고하기 때문입니다. 이것은 수백 또는 수천 개의 파일 / 폴더에 몇 레벨의 깊이에 큰 문제가 아니지만 수백만 개의 폴더에 수조 개의 파일이 수십 레벨에 이르는 경우 시스템을 다운시킬 수 있습니다. .

"10 만 개의 파일 만"가지고 있고 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 비트 문자를 사용하는지 또는 유니 코드 문자를 사용하는지 (유니 코드를 사용하는지) 시스템이 32 비트 또는 64 비트인지 여부에 따라 목록을 저장하려면 25GB에서 49GB의 메모리가 필요합니다 (매우 중요합니다) 단순화 된 구조).

이유 윈도우를 삭제하기 전에 파일과 폴더를 열거하려고 당신이 그들을 제거하기 위해 사용하는 방법에 따라 다르지만, 모두 탐색기 명령 인터프리터 (명령을 시작할 때 지연을 볼 수 있습니다) 그것을 할. 드라이브에서 디렉토리 트리를 읽을 때 디스크 활동 (HDD LED)이 깜박이는 것을 볼 수도 있습니다.

해결책

이러한 상황을 처리하는 가장 좋은 방법은 파일과 폴더를 한 번에 하나씩 삭제하는 삭제 도구를 사용하는 것입니다. 그것을 할 수있는 기성 도구가 있는지는 모르겠지만 간단한 배치 파일로 수행 할 수 있어야 합니다.

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

이것이하는 일은 인수가 전달되었는지 확인하는 것입니다. 그렇다면 지정된 디렉토리로 변경됩니다 (현재 디렉토리에서 시작하거나 다른 드라이브에서도 디렉토리를 지정하기 위해 인수없이 실행할 수 있습니다).

다음으로 현재 디렉토리의 모든 파일을 삭제합니다. 이 모드에서는 아무 것도 열거하지 않아야하며 메모리를 많이 차지하지 않고 파일을 삭제하면됩니다.

그런 다음 현재 디렉토리 의 폴더를 열거하고 자신을 호출하여 각 폴더를 자신에게 전달하여 아래로 반복합니다.

분석

이것이 작동 해야하는 이유 는 전체 트리 에서 모든 단일 파일과 폴더를 열거하지 않기 때문 입니다 . 파일을 전혀 열거하지 않으며 현재 디렉토리의 폴더와 상위 디렉토리 의 나머지 폴더 만 열거합니다 . 주어진 폴더에 단지 수백 개의 하위 디렉토리가 있다고 가정하면, 이것은 너무 나쁘지 않아야하며 전체 트리를 열거하는 다른 방법보다 훨씬 적은 메모리를 필요로합니다.

/r(수동) 재귀를 사용하는 대신 스위치를 사용하는 것에 대해 궁금 할 수 있습니다 . /r스위치가 재귀를 수행하는 동안 우리가 피하고 싶은 전체 디렉토리 트리를 미리 열거 하기 때문에 작동 하지 않습니다. 추적하지 않고 삭제하면서 삭제하고 싶습니다.

비교

이 방법을 전체 열거 방법과 비교할 수 있습니다.

당신은“수백만 개의 디렉토리”를 가지고 있다고 말했습니다. 1 억이라고합시다. 트리가 대략 균형을 이루고 폴더 당 평균 약 100 개의 하위 디렉토리를 가정하면 가장 깊은 중첩 디렉토리는 약 4 단계 아래로 내려갑니다. 실제로 전체 트리에는 101,010,100 개의 하위 폴더가 있습니다. (100M이 100과 4로 나눌 수있는 방법을 즐겁게합니다.)

파일을 열거하지 않기 때문에 4 × 100 = 400주어진 시간에 최대 디렉토리 까지 레벨 당 최대 100 개의 디렉토리 이름 만 추적하면됩니다 .

따라서 메모리 요구 사항은 ~ 206.25KB 여야하며 최신 (또는 다른) 시스템의 범위 내에 있어야합니다.

테스트

불행히도 (?) 수백만 개의 폴더에 수조 개의 파일이있는 시스템이 없으므로 테스트 할 수 없습니다 (마지막으로 ~ 800K 파일이 있다고 생각합니다). 다른 사람이 시도해야합니다 그것.

경고

물론 메모리 만이 유일한 제한은 아닙니다. 삭제하는 모든 파일과 폴더에 대해 시스템이 드라이브를 사용 가능으로 표시해야하기 때문에 드라이브도 병목 현상이 발생합니다. 고맙게도, 이러한 디스크 작업 중 많은 부분이 개별적으로 (최소한 이동식 드라이브가 아닌 하드 드라이브의 경우) 함께 묶여 (캐시되고) 청크로 작성되지만 시스템이 읽을 때 여전히 약간의 스 래싱이 발생합니다 데이터를 씁니다.


이것이 작동하지 않는다고 확신합니다. 나는 그것을 시도했다. 문제는 FOR 루프에 있습니다. FOR은 DEL을 직접 발행하는 것과 동일한 문제를 야기합니다.
Jackey Cheung

1
사용하는 스위치에 따라 다릅니다. /r스위치 를 사용한 경우 , 설명 된대로 모든 파일을 열거하려고 시도합니다. /d스위치 를 사용하면 현재 디렉토리의 폴더 만 열거하므로 현재 디렉토리에 10 억 개의 폴더가 없으면 문제가 발생하지 않습니다.
Synetech

7

나는 수조 개의 파일을 말할 수 없지만 최근에 ~ 1.8M 파일을 포함하는 오래된 파일 공유를 nuk했습니다.

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

"EmptyTMPFolder"는 비어있는 로컬 디렉토리입니다. / MIR 옵션은 대상을 소스처럼 보이게합니다 (비어 있음).

이 방법의 실질적인 이점은 재시도 옵션 (/ R : 30)이었습니다. 이를 통해이 프로세스 중에 발생할 수있는 모든 연결 문제를 해결할 수있었습니다. 로컬 삭제는이 방법에서 도움이되지 않을 수 있습니다.

시간을 비교할 특정 벤치 마크는 없지만 재시도 / 대기 옵션의 b / c에서 제안 된 다른 옵션 중 일부를 선호합니다. 삭제는 거의 즉시 시작되었습니다.


대규모 네트워크 드라이브 폴더 트리에서 정리를 실행할 때 이것이 가장 효율적인 방법이라는 것을 알았습니다. 팁 주셔서 감사합니다.
Tonny

5

모든 폴더를 삭제하는 데 시간이 오래 걸리며 할 일이 많지 않습니다. 할 수있는 일은 데이터를 저장하고 드라이브를 포맷하는 것입니다. 최적은 아니지만 작동합니다 (빠르게).

다른 옵션은 NTFS 파티션에서 읽을 수있는 라이브 CD에서 일부 Linux 배포판을 사용하는 것입니다. rm -rf folderName2GB RAM이있는 시스템을 손상시키지 않고 최소 2 일 동안 실행할 수있는 개인적인 경험을 알고 있습니다 . 시간이 걸리지 만 최소한 완료됩니다.


1
흠, 리눅스. Cygwin에 대해 생각하고 있습니다. 밑줄을 긋는 Windows 기능을 사용한다고 가정하지만 경우에 어떤 차이가 있는지 궁금합니다. 나는 그것을 시험해 볼 것이다.
Jackey Cheung

1
git bash
raindrop을

4

음 .. 당신이 어떻게 그렇게 많이 창조했는지 알고 싶지 않습니다.

무슨 일이 일어나고 있는지 탐색기는 모든 단일 파일을 열거하고 삭제하기 전에 메모리에 정보를 저장하려고합니다. 그리고 너무 많은 방법이 있습니다.

명령을 시도 했습니까 rmdir /s? 열거 된 모든 파일을 기다리지 않고 발견 된 파일을 실제로 삭제하는 한 작동 할 수 있습니다.

몇 개의 하위 디렉토리가 있습니까? 하나 또는 다른 낮은 숫자가있는 경우 수동으로 반복되는 빠른 배치 파일이 작동 할 수 있습니다.

그러나 모든 방법은 시간이 걸립니다.


물론 soandos의 재 포맷에 대한 제안을 제외하고. 빠르지 만 이것이 시스템 드라이브 인 경우 Windows를 다시 설치해야합니다.
Bob

열거가 이루어져야한다고 확신하므로 프로그램은 다음에 무엇을 삭제할지 알고 있습니다. rmdir은 파일이 처음부터 시작되어 파일을 발견 할 때 삭제할 수 없으며 어떻게 든 통과해야합니다. 유일한 질문은 얼마나 많은 초과 정보가 저장되는지입니다.
soandos

@soandos Explorer는 모든 파일을 계산 합니다. DFS 스타일의 열거 형을 구현하는 몇 가지 방법을 생각하고있었습니다. 가능한 한 지점으로 내려 가서 파일에 도달하면 삭제하고 다시 돌아옵니다. 다시 말해, 재귀는 무엇을 하는가 rm -rf입니다. 비교적 얕은 디렉토리 구조에서 가장 잘 작동합니다. 나는 rmdir /s이것이 확실 하지 않습니다. 그것은 해야한다 .
Bob

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 -rfsoandos가 제안한대로 사용 하는 것이 좋습니다.
Bob

1
@JackeyCheung : 틀렸어요. rmdir에 / s 플래그를 지정하면 디렉토리뿐만 아니라 파일도 삭제됩니다.
Harry Johnston

4

이와 같은 문제의 가능한 원인 중 하나는 일반적으로 SAN 환경에서 발견되는 씬 프로비저닝입니다. 일부 SSD (Solid-States Drive)는 같은 문제가 발생할 수 있습니다. 이 경우이 구성 변경으로 문제가 해결 될 수 있습니다.

fsutil behavior set DisableDeleteNotify 1

이 변경 사항은 솔리드 스테이트 드라이브의 성능에 영향을 줄 수 있으며 SAN 드라이브의 자동 및 / 또는 수동 재 시도를 방해 할 수 있습니다.


3

Shift+ Delete휴지통을 건너 뛰고 속도가 크게 향상 될 수 있습니다.

그래도 문제가 해결되지 않으면 (극단적 인 경우) Fast Folder Eraser 및 / 또는 Mass Directory Eraser를 사용해보십시오.


내가 사진 파일의 큰 숫자를 삭제하려고 할 때, 예, 정상 DEL과 비교하면 DEL 매우 빠르고 감사 시프트
V-SHY

3

아마도 모든 바이러스를 소비하고 시스템을 충돌시키는 바이러스 백신 / 맬웨어 방지 프로그램 일 것입니다.

Windows 자체는 많은 수의 파일을 삭제하는 데 문제가 없지만 대부분의 Microsoft 이외의 파일 시스템에서 비슷한 작업보다 느립니다.


좋은 지적이야! 볼만한 가치가 있습니다.
Jackey Cheung

바이러스 백신을 해제했는데 메모리가 여전히 이전과 같이 먹었습니다.
Jackey Cheung

바이러스 백신을 해제해도 프로세스가 중지 된 후 메모리를 확보하는 데 도움이되지 않습니다.
Jackey Cheung

@JackeyCheung : 어떤 바이러스 백신 프로그램입니까? 일부는 실제로 완전히 꺼지지 않습니다 ...
Ben Voigt

2

파일 / 폴더를 삭제할 때 디렉토리가 압축되지 않기 때문에 백만 개의 파일이 들어있는 폴더가 있고 처음 500k를 삭제하면 문제가 발생합니다. 디렉토리의 시작 부분에는 모든 의도를 비울 수있는 수많은 블록이 있습니다.

그러나 탐색기와 명령 프롬프트는 파일이있는 경우를 대비하여 여전히 해당 블록을 살펴 봐야합니다. 도움이 될만한 것은 폴더를 트리 아래로 이동하여 드라이브베이스의 새 폴더로 "이동"한 다음 해당 새 폴더를 삭제하는 것입니다. 폴더를 이동하면 포인터가 폴더로만 이동하므로 폴더 아래의 모든 파일을 실제로 드라이브의 새 공간으로 이동하지 않아야합니다.

시도 할 수있는 또 다른 방법은 많은 파일을 삭제 한 후 "PerfectDisk"와 같은 타사 도구를 폴더에 압축하는 것입니다.


2

천만 개가 넘는 퓨전 로그 파일을 삭제하기위한 다양한 접근 방식을 시도한 결과 10 분 동안 평균 약 30 만 개의 파일이 삭제 될 수 있음을 알았습니다. 천만 개의 파일을 만드는 데 약 55 시간이 걸립니다 ...

아래 스크립트를 사용하면 삭제 율이 ~ 75 % 증가했습니다. 파일 목록은 디스크 작업을 증가시키는 선형 프로세스가 아닌 동시 프로세스에 의해 생성되고 실행됩니다.

PowerShell을 사용하는 옵션이 있으므로 목록을 준비하는 데 필요한 시간이 크게 줄어 듭니다.

BTW, 나는 충돌을 허용하는 두 개의 직접 델 조작을 사용하여 테스트했지만 단일 델 조작에 비해 전체 삭제 시간이 눈에 띄게 감소하지 않았습니다. 삭제 목록을 작성하는 것은 바람직하지 않지만 시간을 절약 할 가치가있었습니다.

@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

이것을 시도하고 필요에 따라 수정하십시오.

Synetech의 기술 설명분석을 기반으로 Win2003에서 테스트 된 스크립트로 , 15:22에 13 년 10 월 15 일에 답변 함

@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%"

A. ~ 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>

Synetech의 스크립트가 작동하지 않는다고 말할 때 @ user4350129가 올바른지 확인할 수 있습니다. Win7x64 상자에서도 같은 동작을했습니다.
leinad13

내 스크립트가 완벽하지 않았으며 arg가 누락되고 overflow가 quoteown anc icacls 명령을 위반 한 경우 문제가 발생했습니다. 또한 파일이 아닌 폴더 만 검사했습니다. 문제를 해결했습니다. 게시물을 편집했지만 항상 사용하기 전에 테스트하십시오.
EO

2

나는 1 천만 개의 파일로 비슷한 문제를 겪었지만 서버 2003에서는 ftp 서버 / 클라이언트를 사용한 파일을 삭제하고 클라이언트가 파일과 폴더를 삭제하도록 남겨 두었습니다. 느린 솔루션이지만 완벽하게 작동합니다.

아마도 당신은 해결책이없는 NTFS의 MFT에 두 번째 문제가있을 것입니다 .MFT는 win 2003에서 (Microsoft가 win 2003 이후에 솔루션을 가지고 있는지 확실하지 않습니다) 모든 파일을 증분 방식으로 저장하는 배열입니다. 수조 개의 파일을 사용하면 크기가 미친 것입니다. 제 경우에는 MFT에 1,700 만 개의 레코드가 있었고 MFT의 크기는 45000 개의 파일로 약 19GB였습니다. 다른 시스템에서 테스트했으며 MFT는 1 백만 개의 레코드처럼 보입니다. 약 1GB입니다.

이 명령으로 MFT의 상태를 확인할 수 있습니다.

defrag C: /a /v
  • C: -단위 서신
  • /a -분석
  • /v -자세한

또 다른 까다로운 솔루션은 MFT를 축소 할 수있는 도구가 없기 때문에 도구는 파일 및 속성 이름을 0으로 채우지 만 그 이상은 아니지만 VMware 변환기 또는 다른 종류의 P2V를 사용하여 가상 시스템을 만들 수 있습니다 귀하의 서버는 MFT와 관련된 모든 문제를 해결할 것입니다 .V2P에서 변환을 테스트 한 적이 없으며 이제 가상 환경에서만 작업하고 있지만 인터넷에서 많은 정보를 보았습니다.

2003 년의 승리로 이제는 완벽하게 작동하고 있으며 MFT의 크기는 40MB이며 모든 것이 정상입니다. 수백만 개의 작은 파일과 관련된 백업, 조각 모음 또는 기타 작업에 대해 자세히 알려면


1

에 StackOverflow에이 답변 의 조합 사용 delrmdir:

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

예, 전에 읽었습니다. 사실 그것은 내 경우에는 도움이되지 않습니다. del 명령이 확실히 충돌하기 때문에.
Jackey Cheung

1

한 번에 파일을 모두 삭제하면 너무 많은 메모리가 사용되므로 한 번에 하나씩 삭제하는 방법이 필요하지만 프로세스는 자동화됩니다. 이런 종류의 일은 유닉스 스타일 쉘에서 훨씬 쉽게 할 수 있으므로 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

얼마 전에 같은 문제가 발생했습니다. 디렉토리를 재귀 적으로 삭제하는 작은 유틸리티를 작성했습니다. 파일을 열거하지 않으며 많은 메모리를 소비하지 않습니다 (n = 최대 디렉토리 깊이 및 m = 하위 디렉토리 중 하나의 최대 파일 / 디렉토리 수에서 최대 O (n + m)). 긴 파일 경로 (> 256 자)를 처리 할 수 ​​있습니다. 이 문제를 해결할 수 있다면 의견을 듣고 싶습니다.

https://github.com/McNetic/fdeltree (릴리스 폴더에서 실행 가능)에서 찾을 수 있습니다.


1

이 스레드는 내가 지원하는 여러 서버에서 3 백만 개가 넘는 파일을 삭제하는 것보다 더 나은 방법을 찾고 있음을 발견했습니다. 위의 방법은 복잡한 IMO를 넘어 서기 때문에 Windows에서 "FORFILES"명령 줄 도구를 사용하는 알려진 방법을 사용했습니다 (Server 2003에 있음).

어쨌든, 아래는 명령 줄에서 폴더의 모든 파일을 삭제하는 데 사용한 FORFILES 명령입니다.

forfiles / P "여기 폴더 경로 (예 : C : \ Windows \ Temp)"/ C "cmd / c echo @file & del / f / q @file"

위의 ECHO는 화면에서 삭제되는 파일의 이름이지만 실제로 무언가의 진행 상황을보고 싶었 기 때문에 만 에코하지 않으면 DOS 상자가 정지 된 것처럼 보입니다. 예상대로 작업을 수행하고 있습니다.

시작하는 데 약간의 시간이 걸립니다. 즉, 한동안 아무것도하지 않는 것처럼 보입니다 (약 3 백만 개의 파일의 경우 약 30m). 결국 파일 이름이 삭제 될 때 파일 이름이 나타나기 시작해야합니다. 이 방법은 파일을 삭제하는 데 시간이 오래 걸리지 만 ( 에코없이 삭제 시간 단축 수 있습니까?) 서버에서 파일을 삭제하는 동안 ~ 1,850Kb의 메모리를 사용하고있었습니다. .

마우스 이동을 유지해야 할 때 서버에 자동 로그 오프가있는 경우 삭제 기간에 문제가 발생할 수 있습니다 (콘솔 사용자로 실행하거나 LanDesk 또는 SCCM 등의 세 번째 도구 (또는 MouseJiggle)를 통해 실행하는 것이 좋습니다). exe))

어쨌든, 나는 나의 대답, 행운을 함께 나누겠다고 생각했다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.