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


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:\Dir1C:\D
  2. 로 이동 C:\D\
  3. 이름 바꾸기 C:\D\Dir1C:\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.