Jak usunąć folder zagnieżdżony dość głęboko i uniknąć „Zbyt długiej nazwy pliku”?

70

Eclipse utworzył folder tymczasowy w jednym z katalogów, który jest zagnieżdżony dość głęboko, np

dir1\dir1\dir1\dir1\...

Nie mogę usunąć tego folderu w systemie Windows za pomocą Eksploratora, poleceń dellub rmdirani polecenia Cygwin „rm”. Jak powinienem usunąć ten bardzo długi folder?

Ciągle mówi „Nazwa pliku jest za długa ...”

użytkownik39186
źródło

Odpowiedzi:

105

Jeśli jesteś podobny do mnie i nie lubisz instalować dodatkowego oprogramowania, aby rozwiązać taki problem, skorzystam z sugestii XQYZ i wykorzystam go robocopydo rozwiązania problemu. (W moim przypadku problem został stworzony przede wszystkim przez robocopy, poprzez skopiowanie katalogu, który zawierał rekurencyjne punkty połączenia bez dostarczania / XJ do robocopy).

Aby usunąć drzewo katalogów zaczynające się na c: \ subdir \ more \ offending_dir :

Cały proces krok po kroku jest tak prosty, jak to:

  1. cd c:\subdir\more na cd do katalogu nadrzędnego.
  2. mkdir empty aby utworzyć pusty katalog.
  3. robocopy empty offending_dir /mir aby utworzyć kopię lustrzaną pustego katalogu w katalogu naruszającym prawo.
  4. Po pewnym oczekiwaniu skończyłeś! Zakończ to:
  5. rmdir offending_dir pozbyć się teraz pustego katalogu obrażającego i
  6. rmdir empty aby pozbyć się pośredniego pustego katalogu.
jofafrazze
źródło
2
Doskonała sugestia. Mój problem został również stworzony przez robocopy, a jak opisałeś, poprawka robocopy działała dla mnie.
Nathan Garabedian,
3
Zrobiłem też bałagan robocopyi punkty połączenia; dzięki za pokazanie mi, jak go użyć, aby posprzątać bałagan!
Mr.Wizard
moje foldery nie zostały utworzone przez robocopy, ale doskonale je usunąłem
Sasha
11
Menedżer pakietów węzłów (NPM) spowodował dla mnie ten problem. Z jakiegoś powodu było tak wiele zagnieżdżonych pakietów.
David Sherret
jest to zdecydowanie najlepsza i najbardziej rozsądna odpowiedź, znacznie lepsza niż niestandardowy cykliczny skrypt wsadowy
monastic-panic
39

Jest to w rzeczywistości dość proste do naprawienia. Powiedz, że struktura katalogów jest taka:

C:\Dir1\Dir1\Dir1\Dir1…

Aby to naprawić, po prostu zmień nazwę każdego folderu na jednoznakową nazwę folderu, dopóki nie będzie już zbyt długo do usunięcia:

  1. Zmień nazwę C:\Dir1naC:\D
  2. Nawigować do C:\D\
  3. Zmień nazwę C:\D\Dir1naC:\D\D
  4. Nawigować do C:\D\D\
  5. Idź 1, aż całkowita długość ścieżki wyniesie <260

Oto plik wsadowy do automatyzacji procesu (ta prosta wersja jest najlepsza dla prostych katalogów takich jak ten opisany w pytaniu, szczególnie dla katalogów jednorazowych). Przekazać ją najwyższą folderu możliwe (na przykład C:\Dir1na C:\Dir1\Dir1\Dir1…lub C:\Users\Bob\Desktop\New Folderza 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

Wyjaśnienie techniczne

Pozostałe proponowane rozwiązania mają charakter wsteczny; nie możesz tego naprawić, idąc od najbardziej wewnętrznego katalogu na zewnątrz, musisz iść w innym kierunku.

Kiedy próbujesz uzyskać dostęp do katalogu, robisz to, używając jego bezwzględnej ścieżki, jawnie lub nie, która obejmuje wszystko, co było przed nim. Dlatego dla takiej struktury katalogów C:\Dir1\Dir1\Dir1\Dir1długość ścieżki do najbardziej wewnętrznego Dir1wynosi 22. Jednak długość ścieżki do najbardziej zewnętrznej Dir1wynosi tylko 7, a zatem jest nadal dostępna niezależnie od jej zawartości (w kontekście ścieżki danego katalogu , system plików nie ma wiedzy o tym, co zawiera ani o wpływie, jaki ma na całkowitą długość ścieżki swoich katalogów potomnych, tylko katalogi przodków - nie można zmienić nazwy katalogu, jeśli całkowita długość ścieżki będzie zbyt długa).

Dlatego gdy napotkasz zbyt długą ścieżkę, musisz przejść na najwyższy możliwy poziom i zmienić nazwę na jednoznakową i powtórzyć dla każdego poziomu na tym poziomie. Za każdym razem, gdy to robisz, całkowita długość ścieżki ulega skróceniu o różnicę między starą nazwą a nową nazwą.

Jest też odwrotnie. Nie można utworzyć ścieżki większej niż maksymalna obsługiwana długość (w systemach DOS i Windows MAX_PATH = 260). Możesz jednak zmienić nazwy katalogów, od najbardziej wewnętrznego do dłuższego. Powoduje to, że głębsze foldery, których bezwzględna ścieżka wynosi> 260, będą niedostępne. (To nie czyni ich „ukrytymi” ani bezpiecznymi, ponieważ są wystarczająco proste, aby się do nich dostać, więc nie używaj tej metody do ukrywania plików.)


Ciekawa uwaga dodatkowa

Jeśli tworzysz foldery w Eksploratorze Windows 7, może się wydawać, że Eksplorator umożliwia tworzenie podkatalogów w taki sposób, że łączna długość jest dłuższa niż MAX_PATHw rzeczywistości, ale tak naprawdę oszukuje za pomocą „nazw plików DOS 8.3”. Możesz to zobaczyć, tworząc drzewo, takie jak:

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

Ma 696 znaków, co oczywiście jest znacznie dłuższe niż 260. Ponadto, jeśli przejdziesz do najbardziej wewnętrznego podkatalogu w Eksploratorze, wyświetli się on zgodnie z oczekiwaniami na pasku adresu, gdy nie jest aktywny, ale po kliknięciu adresu pasek zmienia ścieżkę na C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\, która ma tylko 102 znaki.

W XP nie robi tego, zamiast tego zdecydowanie odmawia utworzenia dłuższej ścieżki niż jest obsługiwana.

Naprawdę interesujące byłoby dowiedzieć się, jak Eksplorator Windows 7 obsługuje „zbyt długie ścieżki”, gdy NtfsDisable8dot3NameCreationjest ustawiona ta opcja.

Synetech
źródło
3
Możliwe jest utworzenie ścieżki dłuższej niż MAX_PATH, jak wyjaśniono tutaj . Niestety \\?` doesn't work with rmdir`.
grawity
@grawity, tak, ale dzieje się tak, ponieważ działa w ramach tej samej zasady: krótka ścieżka zostaje przemianowana na dłuższą; robi to po prostu dynamicznie, rozszerzając zmienną, a nie ręcznie zmieniając jej nazwę na bardziej płynną. Nie można utworzyć katalogu, którego ścieżka bezwzględna jest zbyt długa, gdy polecenie tworzenia ma wystarczającą ilość informacji, aby określić całkowitą długość.
Synetech,
3
@ Synetech: Nie, działa inaczej. Ścieżki takie jak \\?\C:\dir\dir\dir\dirdosłownie ominąć MAX_PATH; nie ma tu żadnych „zmiennych”. (Ale jak powiedziałem, z jakiegoś powodu nie działa z rmdirinnymi cmd.exewbudowaniami.)
grawity
np. spróbuj uruchomić md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Nie zadziała, ponieważ system plików ma wystarczające informacje, aby określić, że całkowita długość ścieżki wyniesie 263 znaków, więc zawiedzie.
Synetech,
2
(Nie należy również mylić długości ścieżki z długością komponentu . Nie można mieć pojedynczego katalogu o nazwie przekraczającej 255 znaków; można jednak mieć ścieżkę znacznie dłuższą.)
grawity
17

Możesz skrócić ścieżkę, używając substdo utworzenia dysku wirtualnego:

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

Zmień na dysk wirtualny:

cd Z:

Teraz możesz usunąć pliki:

del *.*

Usuń dysk wirtualny:

cd C:\TEMP
subst Z: /d

Usuń katalog:

rd /s dir1
Matthew Simoneau
źródło
Nie; to pierwsze polecenie nie zadziała, jeśli katalog jest za długi; zwróci błąd Nieprawidłowy parametr .
Synetech
2
@Synetech, jasne, ale jeśli podmienisz tylko C:\TEMP\dir1\dir1\dir1, spowoduje to skrócenie jego części, co pozwoli ci wejść. To jest jak twoja sugestia zmiany nazwy, ale zamiast tego z mapowaniem. ;)
Bobson,
@ Bobson, dobrze, masz rację; +1 dla was obojga. :-)
Synetech
10

Napisałem małą aplikację C #, aby pomóc mi usunąć podobną bardzo głęboką strukturę wygenerowaną przez nieostrożne użycie Robocopy i kopii zapasowej z Homeserver; domyślnie Robocopy traktuje wspólne punkty jak zwykłe foldery ... :-( Możesz skończyć z wielkim bałaganem, nie zauważając go.

Narzędzie jest dostępne w CodePlex z plikami źródłowymi, z których każdy może korzystać.

http://deepremove.codeplex.com

JPJofre
źródło
PRACUJE!!! Ta odpowiedź musi być oznaczona jako działająca! Oprogramowanie działa jak masło .. rozwiązałem mój problem w kilka sekund !! Dziękuję Ci!
Rafique Mohammed
7

Jakiś czas temu stworzyłem mały, niezależny plik wykonywalny narzędzia o nazwie DeleteFiles , którego można użyć do łatwego wykonania tego zadania.

Za pomocą tego niezależnego narzędzia możesz po prostu:

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

aby usunąć całą strukturę folderów. -r przekształca hierarchię folderów od katalogu początkowego w dół, -f usuwa wszystkie puste foldery (które będą wszystkimi, jeśli użyjesz . jako specyfikacja pliku). DeleteFiles obsługuje ścieżki dłuższe niż limit Windows MAX_PATH, więc będzie dobrze działać na głęboko zagnieżdżonych folderach.

DeleteFiles jest darmowy i open source i możesz pobrać kod binarny lub źródłowy z GitHub lub zainstalować bezpośrednio za pomocą Chocolatey

Rick Strahl
źródło
Dzięki, niesamowite narzędzie, ++ za umieszczenie go w czekoladowym;) Ułatwia integrację z narzędziem CI!
Charles Ouellet
1
To załatwiło sprawę. Jeśli masz naprawdę długą ścieżkę, dodanie > NULdo końca może przyspieszyć proces.
ryscl
Rozwiązanie robocopy nie działało dla mnie i żadne rozwiązanie Synetech. DeleteFiles działało dla mnie, ale z jakiegoś powodu musiałem uruchomić go trzy razy, aby wszystkie podfoldery zostały usunięte. W każdym razie rozwiązało to mój problem.
Frank
Re: uruchomienie DeleteFiles 3 razy. Widziałem to również - uważam, że jest to spowodowane dziwactwami systemu Windows, które blokują foldery z plikami na krótki czas, nawet po usunięciu plików. Wielokrotne przejścia wychwytują sporadyczne awarie tego problemu w podfolderach - potencjalnie wiele gniazd. Widzę takie samo zachowanie w przypadku usuwania przez Eksploratora głębokich drzew.
Rick Strahl,
5

Prosty i łatwy teraz

Stawałem czoła temu samemu problemowi od tak długiego czasu, gdy moduły node_moduły bardzo zagnieżdżały foldery. w końcu stworzył skrypt, aby naprawić to, co może usuwać foldery przez skracanie ścieżek.

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

npm install fdel -g

fdel ./node_modules
dev.meghraj
źródło
Nie wiem, dlaczego projektanci postanowili uwzględnić każdą zależność w strukturze, skoro mogliby to zrobić z płaską strukturą. Więc ten skrypt był dla mnie najłatwiejszy, ponieważ już korzystam z node.js
user2610529
4

Podczas pracy z Sikuli zostałem wciągnięty w pętlę rekurencyjną Calculator.sikuli w programie, który stworzył niezliczoną ilość reżimów „kalkulator.sikuli.calculator.sikuli”. Mogę przenieść drzewo, ale nazwa ścieżki jest zbyt długa, aby ją usunąć.

Po wypróbowaniu kilku rozwiązań z popd loop, Scandisk i nigdzie (zauważalnie) nigdzie ...

Napisałem ten skrypt, aby „zagłębić się” w powtarzające się katalogi (w katalogu o nazwie „a”), przenieść je (do katalogu o nazwie „b”), a następnie usunąć przycięte drzewo, przenieść je z powrotem (do „a”) , i powtórz:

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 Służy do usuwania nieskończenie powtarzających się podfolderów
  • REM sugeruje, aby najpierw zatrzymać usługę wyszukiwania systemu Windows (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

To jest tylko wezwanie do ponownego uruchomienia pliku wsadowego.

SiloSix
źródło
Spoglądałem na to godzinami. Ten plik .bat jest jak podarunek z nieba. Ty, silosie, jesteś aniołem. xD
Squish
2

Mieliśmy taki problem w pracy, gdy zaćmienie postanowiło stworzyć śmieci na dyskach twardych. Naprawiliśmy to za pomocą funkcji robocopy / MIR, aby utworzyć kopię lustrzaną pustego katalogu w zagnieżdżonym katalogu.

XQYZ
źródło
1

Spróbowałbym otworzyć wiersz polecenia i uruchomić:

rmdir /s <directory>

Jeśli to nie zadziała, włożę dysk CD do drzewa katalogów i spróbuję usunąć podzbiór katalogów - powiedzmy 20 najbardziej wewnętrznych katalogów - a następnie zacznę pracę.

Jesse S.
źródło
1
Wypróbowałem powyższą sugestię i nadal wyświetla się komunikat „Katalog nie jest pusty”, gdy uruchamiam powyższą komendę kilka poziomów w głąb
użytkownik39186
1
To dlatego, że ta metoda jest odwrotna. ;-)
Synetech
1

Jeśli jest to folder sieciowy, po prostu udostępnij katalog macierzysty tego katalogu i zamapuj go na dysku na komputerze lokalnym, a następnie usuń folder.

Punnakadu
źródło
21966 [main] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: *** błąd fa - błąd wewnętrzny podczas odczytu środowiska Windows - zbyt wiele zmiennych środowiskowych?
user39186,
Próbowałem przeniesienie aa podfolder zagnieżdżone 20 poziomów głęboko i dostał Powyższy błąd
user39186
1

Otwórz wiersz polecenia.

Przejdź do folderu / katalogu, który zawiera najwyższy „katalog 1” (przyjmiemy C: \)

c:\> RD /s dir1

Edytuj (po dodaniu komentarzy) :

Inne pomysły:

MS oferuje informacje na temat sposobów radzenia sobie z problemem (wiele pomysłów, aby spróbować) tutaj .

Jest też to narzędzie (nigdy nie używałem go osobiście) - TooLongPath .

Być może napisz coś (ponieważ masz Eclipse), który nawiguje do samego końca, a następnie wycofuje się o jeden poziom na raz, usuwając go w miarę upływu czasu?

Ƭᴇcʜιᴇ007
źródło
1
Podczas używania powyższego polecenia
pojawiają się
Próbowałem przemierzać głębokie poziomy „n” i próbowałem użyć tego samego polecenia, ale to nie wydaje się pomocne
user39186,
to działało dla mnie na Win7! dzięki
leoh
1

Inne rozwiązanie: pobierz Total Commander. Jest to bardzo przydatny program, nie tylko dlatego, że rozpoznaje długie nazwy plików.

Niezarejestrowana wersja jest nagware, ale w pełni funkcjonalna, wykona zadanie.

Loren Pechtel
źródło
1

Można to zrobić bezpośrednio z wiersza polecenia lub w pliku wsadowym, tworząc ścieżkę UNC do katalogu, który chcesz usunąć

więc zamiast

rmdir /s/q c:\mydirectory

posługiwać się

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

Ścieżki w stylu UNC mogą być znacznie dłuższe i ominąć limit 260 znaków.

Steve Cooper
źródło
Nie działa 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-bitowy
Victor
Nie działa w systemie Windows 10. Wciąż za długo.
BananaAcid
Wersja `\\?` Działała na mnie w systemie Windows 10!
Piotra
0

Gdy mam ten problem, po prostu zmieniam nazwy niektórych folderów na znacznie krótsze, a następnie, gdy łączna ścieżka jest wystarczająco krótka, usuwa OK. Nie są potrzebne żadne dodatkowe narzędzia.

music2myear
źródło
Tak, ale jak powiedziałem, musisz pracować z zewnątrz, inaczej nie zadziała.
Synetech
Oczywiście. Ogólnie najdłuższe nazwy folderów wydają się być pierwsze (w folderach łatek) lub ostatnie. W większości przypadków wystarczy zmienić jedną lub dwie nazwy folderów, aby uzyskać odpowiednią długość.
music2myear
Tak, ale jeśli zaczniesz od najbardziej wewnętrznego, nie zadziała, ponieważ renpolecenie zakończy się niepowodzeniem path too long.
Synetech,
1
Tak, powyższe skrypty są sprytną i skuteczną metodą automatycznego rozwiązania tego problemu. Zdarzyło mi się to tylko kilka razy, więc po prostu użyłem ręcznej zmiany nazwy. Aby to zrobić, po prostu zaczynam zmieniać nazwę struktury folderów tam, gdzie akurat się znajduję, w drzewku naruszającym, a moim doświadczeniem jest, że najdłuższe nazwy folderów pojawiają się częściej na początku lub na końcu struktury drzewa. Moja odpowiedź jest zatem prawidłowa, choć prawdopodobnie nie najsilniejsza ani najmądrzejsza tutaj. Nie warto głosować negatywnie.
music2myear
> Po prostu zaczynam zmieniać nazwę struktury folderów, gdziekolwiek się znajduję w szkodliwym drzewie Cóż, tak, jeśli już jesteś w drzewie, z pewnością możesz zmienić nazwę przynajmniej tego folderu (musisz przejść do jego rodzica) ; możesz również zmienić nazwę podfolderu, ale może to być zbyt długie.
Synetech,
0

Miałem ten sam problem, tyle że został utworzony przez rekurencyjne zadanie Cobian Backup. Okazuje się, że darmowe oprogramowanie Cobian zawiera aplikację Deleter, która może bardzo szybko usunąć te irytujące zagnieżdżone foldery.

Znajduje się pod menu narzędzi.

mrshl
źródło
0

Zetknąłem się z tym samym problemem związanym z katalogiem o głębokości katalogów ponad 5000, co niektóre aplikacje Java, i napisałem program, który pomoże ci usunąć ten folder. Cały kod źródłowy znajduje się w tym linku:

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

Po pewnym czasie to wszystko usunęło, ale udało się to zrobić, mam nadzieję, że pomoże ludziom, którzy (tak jak ja) napotykają ten sam frustrujący problem

Imanol Barba Sabariego
źródło
-3

Twój system plików może być uszkodzony. Uruchom program chkdsk, aby sprawdzić, czy coś naprawia, a następnie spróbuj usunąć folder.

żongler
źródło
Nie, to nie jest problem. Problem polega na tym, że całkowita długość ścieżki jest dłuższa niż obsługiwana ( MAX_PATH=255). Może się to zdarzyć nawet w przypadku nieuszkodzonego systemu plików.
Synetech
Uruchomienie polecenia chkdsk w folderze spowodowało następujący błąd. Dysk, ścieżka lub nazwa pliku jest niepoprawna
użytkownik39186,