Come posso eliminare una cartella nidificata abbastanza in profondità ed evitare "Nome file troppo lungo"?


70

Eclipse ha creato una cartella temporanea in una delle directory che è nidificata abbastanza in profondità, ad es

dir1\dir1\dir1\dir1\...

Non riesco a eliminare questa cartella in Windows tramite Explorer, i comandi delo rmdir, né il comando 'rm' di Cygwin. Come devo rimuovere questa cartella molto lunga?

Continua a dire "Nome file troppo lungo ..."


Risposte:


105

Se sei come me e non ti piace installare software aggiuntivo per risolvere un problema come questo, andrei con il suggerimento di XQYZ e usereirobocopy per risolvere il problema. (Nel mio caso il problema è stato creato da robocopy in primo luogo, copiando una directory che conteneva punti di giunzione ricorsivi senza fornire / XJ a robocopy).

Per eliminare l'albero delle directory a partire da c: \ subdir \ more \ offending_dir :

Il processo passo-passo totale è semplice come questo:

  1. cd c:\subdir\more per cd nella sua directory principale.
  2. mkdir empty per creare una directory vuota.
  3. robocopy empty offending_dir /mir per rispecchiare la directory vuota in quella offensiva.
  4. Dopo qualche attesa hai finito! Termina con:
  5. rmdir offending_dir per sbarazzarsi della directory offensiva ora vuota e
  6. rmdir empty per sbarazzarsi della directory vuota intermedia.

2
Suggerimento eccellente. Il mio problema è stato creato anche da robocopy e, come hai descritto, la correzione di robocopy ha funzionato per me.
Nathan Garabedian,

3
Ho anche fatto un casino con robocopye punti di giunzione; grazie per avermi mostrato come usarlo per ripulire il casino!
Mr.Wizard,

le mie cartelle non sono state create da robocopy ma le hanno rimosse perfettamente
Sasha

11
Node Package Manager (NPM) mi ha causato questo problema. C'erano così tanti pacchetti nidificati per qualche motivo.
David Sherret,

questa è chiaramente la risposta migliore e più ragionevole, molto meglio di uno script batch ricorsivo su misura
panico monastico

39

Questo è in realtà abbastanza semplice da risolvere. Supponiamo che la struttura delle directory sia tale:

C:\Dir1\Dir1\Dir1\Dir1…

Per risolverlo, basta rinominare ogni cartella con un nome cartella di un carattere fino a quando non è più troppo lungo per eliminarlo:

  1. Rinomina C:\Dir1inC:\D
  2. Navigare verso C:\D\
  3. Rinomina C:\D\Dir1inC:\D\D
  4. Navigare verso C:\D\D\
  5. Andare 1 fino a quando la lunghezza totale del percorso è <260

Ecco un file batch per automatizzare il processo (questa versione semplice è la migliore per le directory semplici come quella descritta nella domanda, specialmente per quelle usa e getta). Passalo nella cartella più alta possibile (ad es. C:\Dir1Per C:\Dir1\Dir1\Dir1…o C:\Users\Bob\Desktop\New Folderper 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

Spiegazione tecnica

Le altre soluzioni proposte sono al contrario; non puoi risolverlo lavorando dalla directory più interna verso l'esterno, devi andare nella direzione opposta.

Quando si tenta di accedere a una directory, lo si fa utilizzando il suo percorso assoluto, esplicitamente o meno, che include tutto ciò che lo precede. Pertanto, per una struttura di directory simile C:\Dir1\Dir1\Dir1\Dir1, la lunghezza del percorso verso l'interno Dir1è 22. Tuttavia, la lunghezza del percorso verso l'esterno Dir1è solo 7 e pertanto è ancora accessibile indipendentemente dal suo contenuto (nel contesto del percorso di una determinata directory , il file system non è a conoscenza di ciò che contiene o dell'effetto che ha sulla lunghezza totale del percorso delle sue directory figlio; solo le sue directory antenate: non è possibile rinominare una directory se la lunghezza totale del percorso sarà troppo lunga).

Pertanto, quando incontri un percorso troppo lungo, quello che devi fare è andare al livello più alto possibile e rinominarlo con un nome di un carattere e ripetere per ogni livello in esso. Ogni volta che lo fai, la lunghezza totale del percorso si accorcia della differenza tra il vecchio nome e il nuovo nome.

È vero anche il contrario. Non è possibile creare un percorso maggiore della lunghezza massima supportata (su DOS e Windows, MAX_PATH = 260). Tuttavia, è possibile rinominare le directory, lavorando dall'interno più interno, a un nome più lungo. Il risultato è che le cartelle più profonde il cui percorso assoluto è> 260 saranno inaccessibili. (Ciò non li rende "nascosti" o sicuri, poiché sono abbastanza semplici da raggiungere, quindi non utilizzare questo metodo per nascondere i file.)


Nota laterale interessante

Se si creano cartelle in Esplora risorse di Windows 7, può sembrare che Explorer consenta di creare sottodirectory in modo tale che la lunghezza totale sia più lunga di MAX_PATH, e in effetti lo è, tuttavia in realtà è barare usando "nomi di file DOS 8.3". Puoi vederlo creando un albero come il seguente:

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

È lunga 696 caratteri, che ovviamente è molto più lunga di 260. Inoltre, se navighi nella sottodirectory più interna in Explorer, la mostra come previsto nella barra degli indirizzi quando non è attiva, ma quando fai clic sull'indirizzo barra, cambia il percorso in C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\, che è lungo solo 102 caratteri.

In XP, non lo fa, invece rifiuta fermamente di creare un percorso più lungo di quanto sia supportato.

Ciò che sarebbe davvero interessante è scoprire come Windows 7 Explorer gestisce i "percorsi troppo lunghi" quando l' NtfsDisable8dot3NameCreationopzione è impostata.


3
E ' è possibile creare un percorso più lungo di MAX_PATH, come spiegato qui . Sfortunatamente, \\?` doesn't work with rmdir`.
Grawity

@grawity, sì, ma è perché funziona con lo stesso principio: un breve percorso viene rinominato in uno più lungo; che lo fa solo dinamicamente espandendo una variabile invece di rinominarla manualmente in uno onger. Non è possibile creare una directory il cui percorso assoluto è troppo lungo quando il comando di creazione ha informazioni sufficienti per determinare la lunghezza totale.
Synetech,

3
@Synetech: No, funziona diversamente. Percorsi come \\?\C:\dir\dir\dir\dirletteralmente bypassano MAX_PATH; non ci sono "variabili" coinvolte. (Ma come ho detto, non funziona con rmdiro altri cmd.exebuiltin per qualche motivo.)
Grawity

ad esempio, prova a eseguirlo md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Non funzionerà perché il file system ha informazioni sufficienti per determinare che la lunghezza totale del percorso sarebbe di 263 caratteri, quindi non riesce.
Synetech,

2
(Inoltre, non confondere la lunghezza del percorso con la lunghezza del componente . Non è possibile avere un'unica directory con un nome superiore a 255 caratteri; tuttavia, è possibile avere un percorso molto più lungo di quello.)
gravità

17

È possibile abbreviare il percorso utilizzando substper creare un'unità virtuale:

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

Passa all'unità virtuale:

cd Z:

Ora puoi eliminare i file:

del *.*

Rimuovi l'unità virtuale:

cd C:\TEMP
subst Z: /d

Rimuovi la directory:

rd /s dir1

No; quel primo comando non funzionerà se la directory è troppo lunga; restituirà l'errore Parametro non valido .
Synetech,

2
@Synetech, certo, ma se lo sostituisci solo C:\TEMP\dir1\dir1\dir1, accorcerai parte di esso, permettendoti così di entrare. È proprio come il tuo suggerimento di rinominare, ma con la mappatura. ;)
Bobson,

@Bobson, ok hai ragione; +1 per entrambi. :-)
Synetech,

10

Ho scritto una piccola app C # per aiutarmi a eliminare una struttura molto profonda simile generata da un uso negligente di Robocopy e da un backup da Homeserver; per impostazione predefinita Robocopy tratta i punti comuni come cartelle normali ... :-( Potresti finire con un gran casino senza accorgertene.

Lo strumento è disponibile su CodePlex con i file di origine, che chiunque può usare.

http://deepremove.codeplex.com


LAVORI!!! Questa risposta deve essere contrassegnata come funzionante! Il software funziona come il burro .. risolto il mio problema in pochi secondi !! Grazie!
Rafique Mohammed,

7

Qualche tempo fa ho creato un piccolo eseguibile autonomo chiamato DeleteFiles che è possibile utilizzare per eseguire facilmente questa attività.

Usando questa utility indipendente, puoi semplicemente fare:

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

per eliminare l'intera struttura di cartelle. -r richiama la gerarchia di cartelle dalla directory iniziale in giù, -f elimina tutte le cartelle vuote (che saranno tutte se usate . come filespec). DeleteFiles supporta percorsi più lunghi del limite MAX_PATH di Windows, quindi funzionerà perfettamente su cartelle profondamente nidificate.

DeleteFiles è gratuito e open source e puoi prendere il codice binario o sorgente da GitHub o installarlo direttamente usando Chocolatey


Grazie, fantastico strumento, ++ per averlo messo in cioccolata;) Rende facile l'integrazione in uno strumento CI!
Charles Ouellet,

1
Questo ha funzionato. Se hai un percorso davvero lungo, l'aggiunta > NULalla fine può rendere il processo più veloce.
ryscl,

La soluzione robocopy non ha funzionato per me né per la soluzione Synetech. DeleteFiles ha funzionato per me, ma per qualche motivo ho dovuto eseguirlo tre volte per eliminare tutte le sottocartelle. In ogni caso, questo ha risolto il mio problema.
Frank,

Ri: eseguendo DeleteFiles 3 volte. Ho visto anche questo - credo che sia a causa di alcune stranezze di Windows che bloccano le cartelle con file in loro per un breve periodo anche dopo che i file sono stati eliminati. Passaggi multipli rilevano il fallimento occasionale di questo problema nelle sottocartelle, potenzialmente multi-nidificate. Vedo lo stesso comportamento con Explorer elimina alberi profondi.
Rick Strahl,

5

Semplice e facile ora

mi sono imbattuto in questo stesso problema da così tanto tempo con node_modules che cartelle molto nidificate. così finalmente creato uno script per correggere ciò che può eliminare le cartelle accorciando i percorsi.

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

npm install fdel -g

fdel ./node_modules

Non so perché i designer abbiano scelto di includere ogni dipendenza in una struttura quando avrebbero potuto farcela con una struttura piatta. Quindi questo script è stato il modo più semplice per me poiché sto già utilizzando node.js
user2610529

4

Mentre lavoravo con Sikuli, nel programma mi sono procurato un ciclo di ricorsione Calculator.sikuli che ha reso una quantità innumerevole di dir "calcolatori.sikuli.calculator.sikuli". Potrei spostare l'albero, ma il percorso è troppo lungo per essere eliminato.

Dopo aver provato diverse soluzioni con popd loop, Scandisk e ottenere (percettibilmente) da nessuna parte ....

Ho scritto questo script per 'approfondire' le directory ricorrenti (in una directory chiamata 'a'), spostarle (su una directory chiamata 'b'), quindi eliminare l'albero troncato, spostarli indietro (su 'a') e ripeti:

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 Utilizzato per eliminare le sottocartelle ripetute all'infinito
  • REM suggerisce di interrompere prima il servizio di ricerca di 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

Questa è solo una chiamata per eseguire nuovamente il file batch.


Ho passato ore a esaminare questo. Questo file .bat è come un regalo dal cielo. Tu, silo, sei un angelo. xD
Squish,

2

Abbiamo avuto un problema del genere al lavoro quando Eclipse ha deciso di creare immondizia sui dischi rigidi. L'abbiamo risolto utilizzando la funzione / MIR di robocopy per eseguire il mirroring di una directory vuota in quella nidificata.


1

Vorrei provare ad aprire un prompt dei comandi ed eseguire:

rmdir /s <directory>

Se ciò non funziona, inserirò parzialmente l'albero delle directory e proverei a eliminare un sottoinsieme delle directory - diciamo le 20 directory più interne - e poi mi faccio strada da lì.


1
Ho provato il tuo suggerimento sopra e dice ancora "La directory non è vuota" quando
eseguo

1
Questo perché questo metodo è al contrario. ;-)
Synetech,

1

Se si tratta di una cartella di rete, è sufficiente condividere la directory principale di quella directory e mapparla su un'unità sul computer locale, quindi eliminare la cartella.


21966 [main] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: *** errore errato - errore interno durante la lettura dell'ambiente windows - troppe variabili d'ambiente?
user39186

Ho provato a spostare una sottocartella annidata di 20 livelli in profondità e ho
riscontrato

1

Apri un prompt dei comandi.

Passa alla cartella / directory che contiene il più alto 'dir1' (supponiamo C: \)

c:\> RD /s dir1

Modifica (dopo l'aggiunta dei commenti) :

Altre idee:

MS offre informazioni su come affrontare il problema (molte idee da provare) qui .

C'è anche questo strumento (mai usato personalmente) - TooLongPath .

Forse scrivi qualcosa (dal momento che hai Eclipse) che naviga fino in fondo e quindi esegue il backout di un livello di cartella alla volta, eliminando così via?


1
Ottengo i seguenti 3 errori durante l'utilizzo del comando sopra. La directory non è vuota Il sistema non riesce a trovare il percorso specificato Il nome del file è troppo lungo
user39186

Ho provato ad attraversare dire 'n' livelli in profondità e ho provato a usare lo stesso comando, ma non sembra aiutare
user39186

questo ha funzionato per me su win7! grazie
leoh

1

Un'altra soluzione: vai a scaricare Total Commander. È un programma molto utile, non solo perché è consapevole del nome lungo.

La versione non registrata è nagware ma perfettamente funzionante, farà il suo lavoro.


1

Questo può essere fatto direttamente dalla riga di comando o in un file batch costruendo un percorso UNC nella directory che si desidera eliminare

così invece di

rmdir /s/q c:\mydirectory

uso

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

Percorsi in stile UNC come questo possono essere molto più lunghi e bypassare il limite di 260 caratteri.


Non funziona 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 a 64 bit.
Victor,

Non funziona per Windows 10. Ancora troppo a lungo.
Banana

La versione `\\?` Ha funzionato per me su Windows 10!
Peter,

0

Quando ho questo problema, ho semplicemente rinominato alcuni dei nomi delle cartelle molto più brevi, quindi una volta che il percorso totale è abbastanza breve, verrà eliminato OK. Non sono necessari strumenti extra.


Sì, ma come ho detto, devi lavorare dall'esterno, altrimenti non funzionerà.
Synetech,

Ovviamente. In genere ho scoperto che i nomi delle cartelle più lunghi tendono ad essere i primi (nelle cartelle delle patch) o gli ultimi. Il più delle volte, devi solo cambiare uno o due nomi di cartelle per ottenere la lunghezza giusta.
music2myear,

Sì, ma se inizi con quello più interno, non funzionerà perché il rencomando fallirà path too long.
Synetech,

1
Sì, gli script forniti sopra sono un metodo intelligente ed efficace per gestire automaticamente questo problema. Mi è successo solo poche volte e quindi ho semplicemente usato il processo di rinomina manuale. Per fare ciò, inizio semplicemente a rinominare la struttura delle cartelle ovunque mi trovo nella struttura offensiva e la mia esperienza è che i nomi delle cartelle più lunghi compaiono più spesso all'inizio o alla fine della struttura ad albero. La mia risposta è quindi valida, anche se probabilmente qui non è la più forte o intelligente. Non vale un voto negativo.
music2myear,

> Comincio semplicemente a rinominare la struttura delle cartelle ovunque mi trovo nella struttura offensiva Bene, sì, se sei già all'interno dell'albero, puoi sicuramente rinominare almeno quella cartella (dovrai andare dal suo genitore) ; potresti essere in grado di rinominare anche una sottocartella, ma potrebbe essere troppo lungo.
Synetech,

0

Ho avuto lo stesso problema, tranne per il fatto che è stato creato da un'attività Cobian Backup ricorsiva. Ho scoperto che il software Cobian gratuito include un'applicazione Deleter che può rimuovere facilmente queste fastidiose cartelle nidificate molto velocemente.

Si trova sotto il menu degli strumenti.


0

Mi sono imbattuto nello stesso problema con un pasticcio di cartelle profondo 5000+ che ha fatto qualche applicazione Java e ho scritto un programma che ti aiuterà a rimuovere questa cartella. L'intero codice sorgente è in questo link:

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

Ha rimosso tutto dopo un po ', ma è riuscito a fare il lavoro, spero che aiuti le persone che (come me), incontrano lo stesso problema frustrante


-3

Il tuo filesystem potrebbe essere corrotto. Esegui chkdsk per vedere se ripara qualcosa, quindi prova a eliminare la cartella.


No, non è questo il problema. Il problema è che la lunghezza totale del percorso è più lunga di quella supportata ( MAX_PATH=255). Questo può accadere anche con un file system non corrotto.
Synetech,

L'esecuzione di chkdsk nella cartella mi ha dato il seguente errore. L'unità, il percorso o il nome del file non sono validi
user39186
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.