Windows 2008 서버의 특정 하위 디렉토리에 3 백만 개의 파일이 들어있는 디렉토리가 있습니다. 루트 디렉토리에서 SHIFT + DEL을 통해 수동으로 파일을 삭제하면 시간이 오래 걸립니다. 다른 방법으로 삭제를 수행 할 수 있습니까 더 빠른 방식입니까?
정기적으로 WinXP 암호화 드라이브에서 많은 파일과 디렉토리를 삭제해야합니다. 보통 45,000 개의 폴더에서 약 22GB의 500,000 파일을 삭제해야합니다.
Windows 탐색기로 삭제하는 것은 파일을 열거하는 데 많은 시간을 낭비하기 때문에 쓰레기입니다. 나는 보통 C :\stufftodelete에 삭제할 물건을 옮기고 rmdir /s/q C:\stufftodelete
에 deletestuff.bat 배치 파일을 가지고 있습니다. 이것은 야간에 실행되도록 계획되어 있지만 때로는 하루 동안 실행해야하므로 더 빨리 수행 할 수 있습니다.
다음은 303 개의 폴더에있는 960 개의 작은 5.85 MB 샘플의 빠른 시간 테스트 결과입니다. 방법 1을 실행 한 다음 방법 2를 실행 한 다음 테스트 디렉터리를 다시 설정했습니다.
방법 1은 파일 및 디렉토리 구조를 한 번에 제거합니다.
rmdir /s/q foldername
방법 2는 모든 단일 파일에 대해 화면에 쓰는 오버 헤드를 피하기 위해 파일을 삭제하고 nul로 출력하는 첫 번째 단계가 있습니다. 두 번째 패스는 나머지 디렉토리 구조를 정리합니다.
del /f/s/q foldername > nul
rmdir /s/q foldername
다음은 3,243 개의 폴더에있는 19,521 개의 파일 중 404MB를 사용하는 또 다른 테스트 결과입니다.
따라서 테스트가 많지 않으므로 단일 테스트에서 너무 가깝습니다.
편집 : 더 많은 데이터를 재검토했습니다. 일반적인 경우입니다. 146,918 개의 폴더에 283GB의 1,159,211 개 파일이 있습니다.
와우, 방법 2는 방법 1보다 거의 3 배 빠릅니다! 내 deletestuff.bat을 업데이트 할 예정입니다!
대용량 디렉토리 트리를 정기적으로 삭제해야하는 경우 해당 디렉토리 트리의 루트를 별도의 파티션에 저장 한 다음 모든 것을 삭제해야 할 때마다 간단히 빨리 포맷하십시오. 이 작업을 자동화해야하는 경우이 DOS 명령을 사용할 수 있습니다.
echo Y | format Z: /FS:NTFS /X /Q
여기서 Z :는 '휘발성'파티션입니다. 참고 : 파티션에는 레이블이 없어야합니다. 나는 이것에 관해 blogged했다 여기 .
명령 프롬프트 (시작 -> 실행 -> cmd
) :
del /f /s /q foldername
TeraCopy는 파일 자체를 매우 빠르게 복사/이동하는 것 외에도 파일을 삭제할 수 있으며 매우 빠릅니다. TeraCopy를 발견 한 이래로 나는 설치되지 않은 컴퓨터를 사용하지 않습니다 (복사/이동/삭제).
동일한 설치 프로그램이 x64 에디션을 설치하지만 수동으로 설치해야 사용할 수 있습니다.
안정 버전보다 추천하는 베타 : http://blog.codesector.com/2010/09/22/teracopy-2-2-beta-3/
나는 같은 일을하는 박쥐 파일을 만들었다.
@echo off
echo --------------------WARNING--------------------
echo folder "%~1" will be deleted
echo --------------------WARNING--------------------
pause
echo Deleting folder: "%~1".
time /T
del /f/s/q "%~1" >nul
rmdir /s/q "%~1" >nul
echo Done.
time /T
echo --- Taking ownership.
takeown /f "%~1" /r /d y >nul
icacls "%~1" /reset /t >nul
icacls "%~1" /setowner "%username%" /t >nul
echo Done all.
time /T
그것은 두 단계의 작업을 하나, 파일을 삭제하려고합니다. 두 번째는 파일의 소유권을 확보하는 것입니다. y 는 지역에 따라 변경되어야합니다 (영어로 예를 의미). 작업을 실패한 경우 (예 : 권한 때문에 실패한 경우) 다시 실행해야합니다. 그러나 두 번째 라운드에서는 첫 번째 라운드에서 삭제 된 파일을 삭제하지 않으므로 꽤 빠를 수 있습니다.
이것을 어떻게 사용 하는가. 경로 경로 (예 : c :\windows)에 delfolder.bat로 저장 한 후 다음과 같이 실행하십시오.
delfolder "foldername"
여기서 foldername은 폴더의 이름입니다.
내 테스트에서 123'000 개의 파일을 삭제하는 데 3 분 (7200rpm)이 걸렸습니다. 예!
아래 코드를 사용하면 일반적으로 잘 작동합니다.
mkdir empty_dir
robocopy empty_dir dir_to_wipe /mir /r:0 /w:0 /e
rmdir empty_dir dir_to_wipe
명령 프롬프트에서 rd/s 명령 을 사용하십시오.
최상의 실용적인 해결 방법은 폴더를 어딘가에 (예 : 휴지통) 다른 곳으로 옮긴 다음 삭제를 시작하는 것입니다. 그것은 오래 걸리지 만, 적어도 그것은 방해가 될 것입니다.
모든 파일을 삭제하는 데 필요한 시간은 작업의 고유 한 요구 사항이며 삭제 구현의 비 효율성은 아닙니다.
설치 Cygwin 및 사용 rm -r . 그러나 그것은 과도 할 것 같다.
짧은 파일 이름 생성 기능을 사용할 수 있습니까? 그렇다면 정말로 필요합니까? 파일을 제거하는 것은 메타 데이터 조작 일뿐입니다. 따라서 제거 할 이름의 수가 두 배로 많으면 작업량이 상당히 많습니다.
이 두 가지 앱 중 하나를 사용해 보셨습니까?
가장 빠른 성능을 원하면 덮어 쓰기 수를 0으로 설정하십시오. 옵션을 클릭 한 다음 대화 상자 하단의 값을 변경하여이 작업을 수행하십시오.
원본 필드에 삭제할 경로를 입력 한 다음 삭제를 클릭하십시오.
이 응용 프로그램은 파일을 휴지통에 넣지 않습니다. 조심해서 사용하십시오.
이는 앞서 언급 한 답변을 보완하고 보강하기 위해 제공됩니다.
위의 주어진 두 가지 방법은 매우 효과적 인 것처럼 보일 수 있지만 정확히 동일한 조건에 대해 벤치 마크하지 않으면 성능을 결정하는 것이 어렵습니다.
그런 다음 배치 파일을 통해 구성을 실행하고 Powershell Cmdlet을 사용하여 성능을 기록하고 측정합니다.
다음은 내가 실험했지만 결정적인 성능/결과를 얻을 수 없었던 몇 가지 샘플 폴더 (총 크기라는 이름)입니다.
r.bat
rmdir /s/q 3.2G
rd.bat
del /f/s/q 3.3G > nul rmdir /s/q 3.3G
Powershell :
PS S:\T> Measure-Command { S:\T\rd.bat } > rdlog.txt
PS S:\T> Measure-Command { S:\T\r.bat } > rlog.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_1.7G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_1.8G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_2.4G_log.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_2.7G_log.txt
PS S:\T> Measure-Command { S:\T\r.bat } > r_3.2G_log.txt
PS S:\T> Measure-Command { S:\T\rd.bat } > rd_3.3G_log.txt
Hugo 의 대답은 가장 빠르지 만 첫 번째 단계에서 숨겨진 파일이나 시스템 파일을 제거하지 않으므로보다 완벽한 솔루션을 원하면/a 매개 변수를 사용하십시오.
del /f /s /q /a foldername > nul
rmdir /s /q foldername
Magallanes 로 BAT 파일에 관해서는, takeown과 icacls에 매우주의해야합니다. 왜냐하면 하드 링크가 동일한 권한과 소유자를 공유하기 때문에 불포화 하드 링크 제거하려는 폴더에서 takeown과 icacls를 사용하면 폴더 외부에서 파일의 사용 권한과 소유자가 변경됩니다.
ln.exe 도구를 사용하면 폴더 안에 하드 링크 된 모든 파일을 나열하고 폴더 외부의 파일에 하드 링크되어 있는지 확인할 수 있습니다 (불포화 하드 링크).
ln.exe --enum foldername > HardlinksList.txt