중첩 된 폴더를 삭제하고“파일 이름이 너무 깁니다”를 피하려면 어떻게해야합니까?


70

이클립스는 디렉토리 중 하나에 임시 폴더를 만들었습니다.

dir1\dir1\dir1\dir1\...

탐색기, del또는 rmdir명령 또는 Cygwin 'rm'명령을 통해 Windows에서이 폴더를 삭제할 수 없습니다 . 이 매우 긴 폴더를 어떻게 제거해야합니까?

"파일 이름이 너무 깁니다 ..."


답변:


105

당신이 나 같은이 같은 문제를 해결하기 위해 추가 소프트웨어를 설치하는 마음에 들지 않으면, 내가 갈 것 XQYZ의 제안 과 사용 robocopy문제를 해결하기 위해. (제 경우에는 robocopy가 / XJ를 robocopy에 제공하지 않고 재귀 연결 지점이있는 디렉토리를 복사하여 robocopy에 의해 문제가 발생했습니다).

c : \ subdir \ more \ offending_dir 에서 시작하는 디렉토리 트리를 삭제하려면 다음을 수행하십시오 .

전체 단계별 프로세스는 다음과 같이 간단합니다.

  1. cd c:\subdir\more 부모 디렉토리로 들어갑니다.
  2. mkdir empty 빈 디렉토리를 만듭니다.
  3. robocopy empty offending_dir /mir 빈 디렉토리를 문제가되는 디렉토리로 미러링합니다.
  4. 기다린 후에는 끝났습니다! 다음과 같이 마무리하십시오.
  5. rmdir offending_dir 이제 빈 공세 디렉토리를 제거하고
  6. rmdir empty 중간의 빈 디렉토리를 제거하십시오.

2
훌륭한 제안. 내 문제는 robocopy에 의해 생성되었으며 robocopy 수정 프로그램이 나를 위해 설명했습니다.
— Nathan Garabedian

3
나는 또한 robocopy접점과 혼동을 일으켰다. 엉망을 청소하는 방법을 보여 주셔서 감사합니다!
— Mr.Wizard

내 폴더는 robocopy에 의해 생성되지 않았지만 완벽하게 제거되었습니다
— Sasha

11
노드 패키지 관리자 (NPM)로 인해이 문제가 발생했습니다. 어떤 이유로 중첩 패키지가 너무 많았습니다.
— David Sherret

이것은 분명하고 가장 합리적인 대답이며, 맞춤형 재귀 일괄 스크립트보다 훨씬 좋습니다
— monastic-panic

39

실제로 수정하는 것은 매우 간단합니다. 디렉토리 구조가 다음과 같다고 가정하십시오.

C:\Dir1\Dir1\Dir1\Dir1…

이 문제를 해결하려면 더 이상 삭제할 수 없을 때까지 각 폴더의 이름을 한 문자 폴더 이름으로 바꾸십시오.

  1. 이름 바꾸기 C:\Dir1로C:\D
  2. 로 이동 C:\D\
  3. 이름 바꾸기 C:\D\Dir1로C:\D\D
  4. 로 이동 C:\D\D\
  5. 전체 경로 길이가 <260이 될 때까지 1로 이동

다음은 프로세스를 자동화하는 배치 파일입니다 (이 간단한 버전은 질문에 설명 된 것과 같은 간단한 디렉토리, 특히 일회용 디렉토리에 가장 적합 함). 가능한 가장 높은 폴더를 전달하십시오 (예 : C:\Dir1for C:\Dir1\Dir1\Dir1…또는 C:\Users\Bob\Desktop\New Folderfor C:\Users\Bob\Desktop\New Folder\abcdefghi…)

@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _ 
%0 
popd

기술 설명

다른 제안 된 솔루션은 거꾸로 있습니다. 가장 안쪽 디렉토리에서 바깥 방향으로 작업하여 문제를 해결할 수 없으므로 다른 방향으로 진행해야합니다.

디렉토리에 액세스하려고 할 때 명시 적이든 아니든 절대 경로를 사용하여 디렉토리에 온 모든 것을 포함합니다. 따라서와 같은 디렉토리 구조의 C:\Dir1\Dir1\Dir1\Dir1경우 가장 안쪽 Dir1에 대한 경로의 길이는 22입니다. 그러나 가장 바깥쪽에 대한 경로의 길이는 Dir17에 불과하므로 해당 디렉토리 경로의 내용에 따라 내용에 관계없이 여전히 액세스 할 수 있습니다. , 파일 시스템에는 포함 된 내용이나 파일이 하위 디렉토리의 전체 경로 길이에 미치는 영향에 대한 지식이 없으며 상위 디렉토리에만 있습니다. 전체 경로 길이가 너무 길면 디렉토리 이름을 바꿀 수 없습니다.

따라서 경로가 너무 길면 가능한 한 가장 높은 수준으로 이동하여 한 문자 이름으로 이름을 바꾸고 각 수준에 대해 반복해야합니다. 그렇게 할 때마다 경로의 총 길이가 이전 이름과 새 이름의 차이로 줄어 듭니다.

반대의 경우도 마찬가지입니다. 지원되는 최대 길이보다 큰 경로는 만들 수 없습니다 (DOS 및 Windows에서는 MAX_PATH = 260). 그러나 가장 안쪽에서 바깥쪽으로 작업하여 더 긴 이름으로 디렉토리 이름을 바꿀 수 있습니다. 결과적으로 절대 경로가> 260 인 더 깊은 폴더에는 액세스 할 수 없습니다. (간단히 접근 할 수 있기 때문에 "숨겨 지거나"보안되지는 않습니다. 따라서이 방법을 사용하여 파일을 숨기지 마십시오.)


재미있는 사이드 노트

Windows 7 탐색기에서 폴더를 만드는 경우 탐색기를 사용하여 전체 길이가보다 긴 하위 디렉토리를 만들 수 MAX_PATH있지만 실제로는 "DOS 8.3 파일 이름"을 사용하여 부정 행위를하는 것처럼 보일 수 있습니다 . 다음과 같은 트리를 작성하여이를 확인할 수 있습니다.

C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
   \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
     \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
       \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
        \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
          \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
           \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
            \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\

길이는 696 자이며 물론 260보다 깁니다. 또한 탐색기에서 가장 안쪽의 하위 디렉토리로 이동하면 초점이 맞지 않지만 주소를 클릭하면 주소 표시 줄에 예상대로 표시됩니다. 막대는 경로를으로 변경하며 길이 C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\는 102 자입니다.

XP에서는이 작업을 수행하지 않고 지원되는 것보다 긴 경로를 만드는 것을 꾸준히 거부합니다.

실제로 흥미로운 점은 NtfsDisable8dot3NameCreation옵션이 설정 될 때 Windows 7 탐색기가 "너무 긴 경로"를 처리하는 방법을 찾는 것 입니다.


3
이다 , 더 이상 MAX_PATH보다 경로를 만들 수 있습니다 여기에 설명 된대로 . 불행히도, \\?` doesn't work with rmdir`.
— grawity

@grawity, 그렇습니다. 그러나 같은 원리로 작동하기 때문입니다. 짧은 경로는 더 긴 경로로 이름이 변경됩니다. 변수를 수동으로 바꾸는 대신 변수를 확장하여 동적으로 수행합니다. 작성 명령에 전체 길이를 판별하기에 충분한 정보가있는 경우 절대 경로가 너무 긴 디렉토리를 작성할 수 없습니다.
— Synetech

3
@Synetech : 아니요, 다르게 작동합니다. \\?\C:\dir\dir\dir\dir말 그대로 MAX_PATH를 우회하는 경로 ; 관련된 "변수"는 없습니다. (그러나 내가 말했듯이, 어떤 이유로 든 rmdir다른 cmd.exe내장 시설 과는 작동하지 않습니다 .)
— grawity

예를 들어, 실행 해보 md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 십시오. 파일 시스템에 전체 경로 길이가 263 자임을 결정하기에 충분한 정보가 있으므로 작동하지 않으므로 실패합니다.
— Synetech

2
(또한, 경로 길이를 구성 요소 길이와 혼동하지 마십시오 . 이름이 255자를 초과 하는 단일 디렉토리 를 가질 수는 없지만 그보다 훨씬 긴 경로를 가질 수 있습니다 .)
— grawity

17

subst가상 드라이브를 만드는 데 사용하여 경로를 단축 할 수 있습니다 .

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"

가상 드라이브로 변경하십시오.

cd Z:

이제 파일을 삭제할 수 있습니다 :

del *.*

가상 드라이브를 제거하십시오.

cd C:\TEMP
subst Z: /d

디렉토리를 제거하십시오.

rd /s dir1

아니; 디렉토리가 너무 길면 첫 번째 명령이 작동하지 않습니다. 오류 Invalid parameter를 반환합니다 .
— Synetech

2
@Synetech, 물론, 만약 당신이 단지 미묘한 경우 C:\TEMP\dir1\dir1\dir1, 그것의 일부를 짧게하여 들어갈 수있게합니다. 이름 바꾸기에 대한 제안과 같지만 대신 매핑이 있습니다. ;)
— Bobson

@ 밥슨, 네가 맞아; 둘 다 +1 :-)
— Synetech

10

부주의하게 Robocopy를 사용하고 Homeserver에서 백업하여 생성 된 유사한 매우 깊은 구조를 삭제하는 데 도움이되는 작은 C # 앱을 작성했습니다. 기본적으로 Robocopy는 관절 점을 일반 폴더로 취급합니다 ... :-( 눈치 채지 않고 큰 혼란으로 끝날 수 있습니다.

이 도구는 CodePlex에서 누구나 사용할 수있는 소스 파일과 함께 제공됩니다.

http://deepremove.codeplex.com


공장!!! 이 답변은 작동하는 것으로 표시되어야합니다! 소프트웨어는 버터처럼 작동합니다. 몇 초 만에 내 조사를 해결했습니다! 감사합니다!
— Rafique 모하메드

7

얼마 전에 저는 이 작업을 쉽게 수행하는 데 사용할 수 있는 작은 자체 포함 유틸리티 실행 파일 인 DeleteFiles 를 만들었습니다 .

이 자체 포함 된 유틸리티를 사용하면 간단하게 수행 할 수 있습니다.

deletefiles c:\yourfolder\subfolder\*.* -r -f

전체 폴더 구조를 삭제합니다. -r은 시작 디렉토리에서 아래로 폴더 계층 구조를 되풀이하고, -f는 비어있는 폴더를 삭제합니다 ( . 를 파일 스펙으로 사용하면 모든 폴더가됩니다 ). DeleteFiles는 Windows MAX_PATH 제한보다 긴 경로를 지원하므로 중첩 된 폴더에서 제대로 작동합니다.

DeleteFiles는 무료이며 오픈 소스이며 GitHub 에서 바이너리 또는 소스 코드를 얻 거나 Chocolatey를 사용하여 직접 설치할 수 있습니다


고마워요, 멋진 도구, ++를 초콜릿에 넣는 데 도움이됩니다.;) CI 도구에 쉽게 통합 할 수 있습니다!
— Charles Ouellet

1
이 트릭을했다. 경로가 너무 길면 > NUL끝에 추가 하면 프로세스가 더 빨라질 수 있습니다.
— ryscl

Robocopy 솔루션은 저에게 효과적이지 않았으며 Synetech의 솔루션도 작동하지 않았습니다. DeleteFiles는 나를 위해 일했지만 어떤 이유로 든 모든 하위 폴더를 삭제하려면 세 번 실행해야했습니다. 어쨌든 이것은 내 문제를 해결했습니다.
— Frank

다시 : DeleteFiles를 세 번 실행하십시오. 나는 또한 그것을 보았습니다-파일이 삭제 된 후에도 파일이 들어있는 폴더를 잠시 잠그는 Windows quirks 때문이라고 생각합니다. 다중 패스는 잠재적으로 다중 중첩 될 수있는 하위 폴더에서이 문제가 가끔 발생하는 것을 포착합니다. 탐색기에서 깊은 나무를 삭제해도 동일한 동작이 나타납니다.
— Rick Strahl

5

간단하고 쉬운 지금

폴더가 매우 중첩 된 node_modules로 오랫동안이 같은 문제에 직면했습니다. 결국 경로를 단축하여 폴더를 삭제할 수있는 스크립트를 수정했습니다.

https://github.com/dev-mraj/fdel

npm install fdel -g

fdel ./node_modules

디자이너가 왜 평평한 구조로 만들 수 있었을 때 구조에 모든 종속성을 포함하기로 선택했는지 모르겠습니다. 이미 Node.js를 사용하고 그래서이 스크립트는 나를 위해 가장 쉬운 방법이었다
— user2610529

4

Sikuli로 작업하는 동안 프로그램에서 Calculator.sikuli 재귀 루프를 사용하여 셀 수없이 많은 "calculator.sikuli.calculator.sikuli"dirs를 만들었습니다. 트리를 이동할 수는 있지만 경로 이름이 너무 길어서 삭제할 수 없습니다.

팝 루프로 여러 가지 솔루션을 시도한 후 디스크 검사를 수행하고 (어쩌면) 아무데도 가지 않습니다 ....

이 스크립트를 작성하여 재귀 된 dirs ( 'a'라는 디렉토리에 있음)에 '깊숙이 들어가서'( 'dir'이라는 디렉토리에) 이동 한 다음 잘린 나무를 삭제하고 다시 'a'로 이동합니다. 을 반복하십시오.

1)cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
.............go deeeeeep in         dir *A*
2) move calculator.sikuli ---> D:\b    
.............move the crazy tree to dir *B*    
3) kill D:\a\calculator.sikuli <---KILL(rd)    
.............wipe dir *A*'s tree    
4) move D:\b\calculator.sikuli ---> D:\a\    
.............move the crazy tree back to dir *A*    
REPEAT
  • REM 무한 재귀 하위 폴더를 삭제하는 데 사용
  • REM은 Windows Search 서비스를 먼저 중지하는 것이 좋습니다 (services.msc)

Remdirs.bat

D:
cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
move /-Y calculator.sikuli D:\b
cd D:\b
rd /s/q D:\a\calculator.sikuli
move /-Y calculator.sikuli D:\a
call D:\remdirs2.bat

이것은 배치 파일을 다시 실행하기위한 호출입니다.


나는 이것을 조사하는 데 몇 시간을 보냈다. 이 .bat 파일은 천국의 선물과 같습니다. 당신은 사일로 천사입니다. xD
— Squish

2

우리는 일식이 하드 드라이브에 쓰레기를 만들기로 결정했을 때 이와 같은 문제가있었습니다. 우리는 robocopy의 / MIR 기능을 사용하여 빈 디렉토리를 중첩 된 디렉토리에 미러링하여 수정했습니다.


1

명령 프롬프트를 열고 실행하려고합니다.

rmdir /s <directory>

그래도 문제가 해결되지 않으면 디렉토리 트리에서 CD를 꺼내서 디렉토리의 하위 세트 (예 : 가장 안쪽의 20 개 디렉토리)를 삭제 한 다음 거기서 벗어나려고합니다.


1
나는 위의 제안을 시도하고 아직도 내가 깊은 위의 명령 여러 수준을 실행할 때 "디렉토리가 비어 있지"라고
— user39186을

1
이 방법은 이전 버전이기 때문입니다. ;-)
— Synetech

1

네트워크 폴더 인 경우 해당 디렉토리의 상위 디렉토리를 공유하고 로컬 시스템의 드라이브에 맵핑 한 후 폴더를 삭제하십시오.


21966 [main] mv 1288 D : \ work \ software \ cygwin \ bin \ mv.exe : *** 주요 오류-Windows 환경을 읽는 중 내부 오류-너무 많은 환경 변수?
— user39186

20 단계 깊이로 중첩 된 하위 폴더를 이동하려고했는데 위의 오류가 발생했습니다
— user39186

1

명령 프롬프트를여십시오.

가장 높은 'dir1'이 포함 된 폴더 / 디렉토리로 이동합니다 (C : \라고 가정).

c:\> RD /s dir1

편집 (의견 추가 후) :

다른 아이디어 :

MS는 문제 (아이디어를 많이 시도하는)를 해결하는 방법에 대한 정보 제공 여기를 .

이 도구도 있습니다 (개인적으로 사용하지는 않음) -TooLongPath .

아마도 (이클립스가 있기 때문에) 모든 것을 탐색 한 다음 한 번에 하나의 폴더 레벨을 제거하여 삭제하는 무언가를 작성합니까?


1
위의 명령을 사용하는 동안 다음 3 개의 오류가 발생합니다. 디렉토리가 비어 있지 않습니다 시스템이 지정된 경로를 찾을 수 없습니다 파일 이름이 너무 깁니다
— user39186

나는 'N'수준이 깊은 말을 가로 지르는과 같은 명령을 사용했지만, 도움이하지 않는 것 시도
— user39186

이것은 win7에서 나를 위해 일했습니다! 고마워요
— leoh

1

또 다른 해결책 : Total Commander를 다운로드하십시오. 파일 이름이 길기 때문에 매우 유용한 프로그램입니다.

등록되지 않은 버전은 nagware이지만 완벽하게 작동하며 작업을 수행합니다.


1

삭제하려는 디렉토리에 대한 UNC 경로를 구성하여 명령 행 또는 배치 파일에서 직접 수행 할 수 있습니다.

그래서 대신

rmdir /s/q c:\mydirectory

사용하다

rmdir /s/q \\?\c:\myDirectory

이와 같은 UNC 스타일 경로는 훨씬 길 수 있으며 260 자 제한을 무시할 수 있습니다.


작동하지 않습니다. The path \\?\C:\temp\wqiyretiuqyertiuyqwteiyrutqwuiyertiqrqweirqyert\wqteriuwqyetriuqwteiryutwiuertiuyqerieerrt\IOQWUE~1\QIWUYE~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\ OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1 is too long.Windows 7 64 비트
— Victor

Windows 10에서는 작동하지 않습니다. 여전히 너무 깁니다.
— BananaAcid

`\\?`버전은 Windows 10에서 저에게 효과적이었습니다!
— Peter

0

이 문제가 발생하면 폴더 이름 중 일부의 이름이 훨씬 짧아지고 전체 경로가 짧으면 확인이 삭제됩니다. 추가 도구가 필요하지 않습니다.


예, 그러나 내가 말했듯이 외부에서 작업해야합니다. 그렇지 않으면 작동하지 않습니다.
— Synetech

물론이야. 필자는 일반적으로 가장 긴 폴더 이름이 첫 번째 (패치 폴더에서) 또는 마지막 폴더 인 것으로 나타났습니다. 대부분의 경우 올바른 길이로 가져 오려면 하나 또는 두 개의 폴더 이름 만 변경하면됩니다.
— music2myear

예, 그러나 가장 안쪽으로 시작하면 ren명령이 실패 하므로 작동하지 않습니다 path too long.
— Synetech

1
예, 위에 제공된 스크립트는이 문제를 자동으로 처리하는 영리하고 효과적인 방법입니다. 그것은 나에게 몇 번만 일어 났으므로 간단히 수동 이름 바꾸기 프로세스를 사용했습니다. 이를 위해 문제가되는 트리의 위치에 관계없이 폴더 구조의 이름을 바꾸기 시작하면 트리 구조의 시작 또는 끝에 가장 긴 폴더 이름이 더 자주 나타납니다. 따라서 내 대답은 올바른 답변이지만 아마도 가장 강하거나 똑똑하지는 않습니다. 공감할 가치가 없습니다.
— music2myear

> 문제가 발생한 트리의 위치에 관계없이 폴더 구조의 이름을 바꾸기 시작합니다 . 예, 이미 트리 내부에있는 경우 적어도 해당 폴더의 이름을 바꿀 수 있습니다 (부모로 이동해야 함) ; 하위 폴더의 이름도 바꿀 수 있지만 너무 길 수 있습니다.
— Synetech

0

재귀적인 Cobian Backup 작업으로 생성 된 것을 제외하고는 같은 문제가있었습니다. 나는 밝혀 무료 Cobian 소프트웨어는 쉽게 매우 빠르게 이러한 성가신 중첩 된 폴더를 제거 할 수있는 Deleter가 응용 프로그램이 포함되어 있습니다.

도구 메뉴 아래에 있습니다.


0

일부 Java 응용 프로그램에서했던 5000+ 디렉토리 깊이의 폴더 엉망과 같은 문제가 발생 했으며이 폴더를 제거하는 데 도움이되는 프로그램을 작성했습니다. 전체 소스 코드는 다음 링크에 있습니다.

https://gitlab.imanolbarba.net/imanol/DiREKT

그것은 잠시 후에 모든 것을 제거했지만 일을 처리했습니다. 나는 그것이 같은 좌절감을 느끼는 사람들에게 도움이되기를 바랍니다.


-3

파일 시스템이 손상되었을 수 있습니다. chkdsk를 실행하여 복구 여부를 확인한 다음 폴더를 삭제하십시오.


아니, 그건 문제가 아니야 문제는 전체 경로 길이가 지원되는 길이보다 길다는 것입니다 ( MAX_PATH=255). 이것은 비 파손 파일 시스템에서도 발생할 수 있습니다 .
— Synetech

폴더에서 chkdsk를 실행하면 다음 오류가 발생했습니다. 드라이브, 경로 또는 파일 이름이 유효하지 않습니다.
— user39186
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.