Come rimuovere un albero di directory infinitamente ricorrente?


9

Su uno dei nostri file server Windows 2003 in qualche modo qualcuno o qualcosa è riuscito a creare alberi di directory infinitamente ricorrenti all'interno di alcune cartelle home degli utenti e non possono essere eliminati.

Ti ritrovi con qualcosa del genere:

D:\Student\2012\user.name\servername\student\2012\user.name\servername\student\2012\...

E continua all'infinito per quanto ho potuto dire.

Tentativo di eliminare l'albero delle directory dal sistema in cui risiede sui risultati in "Errore durante l'eliminazione del file o della cartella: Impossibile eliminare il file:". Il tentativo di eliminarlo da un sistema Windows 7 collegato alla condivisione di rete provoca un errore "cartella in uso".

Se si scorre l'albero della directory fino in fondo, alla fine si raggiunge una directory che non può essere aperta o eliminata (se si fa clic con il pulsante destro del mouse nessuna delle opzioni standard appare), tuttavia se si tenta di aprire la stessa directory da una condivisione su un altro sistema può essere aperto, tuttavia Esplora risorse diventa estremamente lento.

Ho provato i suggerimenti in questo post, così come avviare il server con un disco Linux e provare a rm -rf la directory, né ha funzionato.

È un mistero.

Modifica: potrei anche aggiungere che è possibile rinominare le directory, ma non rimuoverle.


1
Un problema simile è stato risolto in Server Fault .
Lilienthal,

Risposte:


14

Avevo anche una cartella infinitamente ricorsiva che era stata creata da un IDE Java e non ero in grado di eliminarla in Esplora risorse o al prompt di cmd.

Tuttavia, quando ho installato git ho anche installato git-bash. In git-bash è possibile emettere il comando:

rm -rfd recursive_folder_name

e se ne occuperà.


Nota importante: questo può richiedere molto tempo ... Fai una pausa, mangia qualcosa, bevi un caffè e lascia che lo strumento Unix faccia il suo lavoro;) Sorprendentemente funziona
Antwane

funziona anche se usi un Linux basato su VMware e monta il disco (se è esterno ...)
Wolfgang Fahl

4

È possibile che ci sia un collegamento simbolico a una cartella da qualche parte, molto probabilmente il secondo studentnel tuo percorso.

Prova a eseguire il comando:

dir D:\Student\2012\user.name\servername

e vedere se studentè contrassegnato come DIR o SYMLINK / JUNCTION.

Ad esempio, questo è un tipico output del dircomando:

04/24/2012  10:58 PM    <DIR>          .
04/24/2012  10:58 PM    <DIR>          ..
04/24/2012  10:58 PM    <SYMLINKD>     a [h:\a]

Si vede che le prime due voci sono contrassegnate come DIR, mentre la terza (un collegamento simbolico a un'altra cartella) è contrassegnata come SYMLINKD. Nel tuo caso (Windows 2003) penso che ci siano JUNCTIONs anziché SYMLINKs.

Se la studentcartella è un collegamento simbolico o un nodo, eseguire i comandi:

cd /d D:\Student\2012\user.name\servername
rmdir student

e quindi sbarazzarsi della ricorsione.


Nessuna delle directory è symlink, ho controllato la prima coppia più quella alla "fine" dove si blocca.
EnglishInfix

2

È possibile che chiunque stia lavorando in quella cartella riesca a creare un punto di giunzione che esegue il back up da user.namea servername, creando così un albero di directory "loop infinito".

Le giunzioni sono una funzionalità del file system NTFS che consente di creare un collegamento simbolico a una directory che funziona come alias della directory. http://en.wikipedia.org/wiki/NTFS_junction_point

Puoi vedere nella sezione "Effetti osservati" della pagina wiki il problema che descrivi.

Prova a eseguire questa utility per elencare le giunzioni sotto quel server:

http://technet.microsoft.com/en-us/sysinternals/bb896768

Dovrebbe anche darti la possibilità di eliminare il punto di giunzione.


2

Ho avuto un problema simile quando eclipse ha creato un albero di cartelle estremamente profondo che non è stato possibile eliminare. Tuttavia, dato che era possibile spostare e rinominare le cartelle, ho scritto un file batch per farlo scorrere lungo l'albero eliminando le cartelle una alla volta e questo ha funzionato! Per un albero di cartelle apparentemente infinitamente profondo di FOLDERNAME nella directory C, cioè

C:/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/*FOLDERNAME*/...

File batch:

:LoopStart
REN "C:/*FOLDERNAME*" "*TEMPFOLDERNAME*"
MOVE "C:/*TEMPFOLDERNAME*/*FOLDERNAME*" "C:/"
RMDIR /S /Q "C:/*TEMPFOLDERNAME*"
GOTO LoopStart
:LoopEnd

Questo funziona perché TEMPFOLDERNAME è ora un albero di lunghezza finita (una singola cartella senza nulla) e il massiccio albero FOLDERNAME ha una cartella in meno ogni volta che il ciclo viene eseguito, raggiungendo infine il fondo rimuovendo una cartella in alto.


1

Mi sono imbattuto nello stesso problema con un pasticcio di cartelle di oltre 5000 directory che ha fatto qualche applicazione Java e ho scritto questo:

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


1

Risolto il mio infinito ciclo di directory con questo script:

:LoopStart
takeown /F "c:\temp\Application Data"
Attrib -S -H "c:\temp\Application Data"
REN "C:\temp\Application Data" "5"
takeown /F "c:\temp\5\Application Data"
Attrib -S -H "c:\temp\5\Application Data"
MOVE "c:\temp\5\Application Data" "C:\temp"
Del /F /S /Q c:\temp\5\*.*
RMDIR /S /Q "C:\temp\5"
GOTO LoopStart
:LoopEnd

0

Ho avuto lo stesso problema. La cartella che volevo eliminare conteneva un albero infinito di collegamenti con lo stesso nome e ogni tentativo di eliminarlo causava un errore "File troppo lungo ...". Non è riuscito a prescindere dal comando che ho provato includendo tutti i metodi precedenti, quindi ho provato il comando "rm" di Cygwin in una finestra cmd appena sopra la cartella in questione. Ho inserito "rm -r -f [cartella]" e la cartella è stata eliminata senza lamentele.

È possibile scaricare Cygwin gratuitamente da https://cygwin.com/install.html . È fondamentalmente una shell UNIX per Windows che contiene tutti i comandi comuni (ad esempio, ls, rm, du e cat) ma ha anche un sacco di pacchetti che se tutti fossero scaricati occuperebbero circa 1 GB di spazio. Credo che il pacchetto di download predefinito includa i comandi UNIX. In caso contrario, sono nel bundle "utils" se la memoria serve.

NOTA: non è necessario eseguire i comandi Cygwin nella finestra della shell bash nativa. Possono essere eseguiti in una finestra cmd aggiungendo il percorso alla directory "bin" di cygwin nella variabile ambientale PATH del sistema. Nel mio caso ho aggiunto "C: \ cygwin64 \ bin".

Spero che questo possa essere d'aiuto.


0

Ho lo stesso problema qui.

In altri post è stato suggerito di eseguire il mirroring di una cartella vuota sulla cartella di destinazione tramite la condivisione di rete con MS RoboCopy.

In questo momento sto eseguendo questo, con "> nul" per accelerare (lo fa, davvero):

"C: \ TEMP" è una cartella vuota e "W: \ TMP" è la cartella interessata :

robocopy / mir c: \ temp \ 127.0.0.1 \ w $ \ tmp> nul


1
Benvenuto in Super User. Se stai citando una soluzione altrove, includi l'attribuzione e un link per ulteriori letture. Le risposte intendono essere soluzioni definitive. Se stai ancora provando questo, potrebbe essere prematuro postare.
fixer1234

0

Anch'io ho avuto questo, su un sistema autonomo di Windows 10. C: \ Utente \ Nome \ Ripeti \ Ripeti \ Ripeti \ Ripeti \ Ripeti \ Ripeti \ Ripeti apparentemente all'infinito.

Come per l'OP, ho potuto navigare utilizzando Windows o il prompt dei comandi fino al 50esimo e non oltre. Non sono riuscito a eliminarlo o fare clic su di esso, ecc. Esattamente come descritto.

C è il mio linguaggio, quindi alla fine ho scritto un programma con un ciclo di chiamate di sistema, che si ripetono fino a quando falliscono. In base al codice DOS di JohnO, ho creato una directory chiamata tmp e ho spostato Repeat \ Repeat in quella, ho eliminato la cartella Repeat ora vuota e ho spostato tmp \ Repeat nella cartella corrente. Ancora e ancora!

 while (times<2000)
 {
  ChkSystem("move Repeat\\Repeat tmp");
  ChkSystem("rd Repeat");
  ChkSystem("move tmp\\Repeat Repeat");
  ++times;
  printf("Removed %d nested so far.\n", times);
 }

ChkSystem esegue solo una chiamata di sistema () e controlla il valore restituito, arrestandosi se fallito.

È importante sottolineare che è fallito più volte. Pensavo che forse il mio programma non funzionasse o che dopo tutto fosse infinitamente lungo. Tuttavia, l'ho già avuto in precedenza con le chiamate di sistema, con le cose che non si sincronizzavano, quindi ho appena eseguito di nuovo il programma e ha continuato da dove era stato interrotto, quindi non pensare che il tuo programma non funzioni. In totale, dopo averlo eseguito circa 20 volte, li ha cancellati tutti. In totale, in origine erano circa 1280 cartelle. Non ho idea di cosa l'abbia causato. Pazzo.


0

Con directory di looping a 3 livelli:

:LoopStart
takeown /F "D:\temp\MyApp"
Attrib -S -H "D:\temp\MyApp"
REN "D:\temp\MyApp" "5"
takeown /F "D:\temp\5\MqttObserver"
Attrib -S -H "D:\temp\5\MqttObserver"
REN "D:\temp\5\MqttObserver" "6"
takeown /F "D:\temp\5\6\PackageFiles"
Attrib -S -H "D:\temp\5\6\PackageFiles"
REN "D:\temp\5\6\PackageFiles" "7"
MOVE "c:\temp\5" "C:\temp"
Del /F /S /Q c:\temp\5\*.*
RMDIR /S /Q "C:\temp\5"
MOVE "c:\temp\6" "C:\temp"
Del /F /S /Q c:\temp\6\*.*
RMDIR /S /Q "C:\temp\6"
MOVE "c:\temp\7" "C:\temp"
Del /F /S /Q c:\temp\7\*.*
RMDIR /S /Q "C:\temp\7"
GOTO LoopStart
:LoopEnd

Spiegazione per andare con il codice? <:: ;; :: ;; :: ;; :: ;;: :( | XXXX |) o ~
Pimp Juice IT

0

Ho risolto il problema eseguendo chkdsk / f tramite la console di amministrazione, riavviato e quindi ho usato il file explorer delete. Sebbene Windows si sia lamentato del lungo file / cartella qualcosa, una volta che ho confermato di eliminare, si è sbarazzato della problematica cartella ricorsiva.

Non sono sicuro se ci sono altri problemi che avrei potuto creare usando la vecchia opzione chkdsk nel mio file system di Windows 7 Pro.


0

Per me questa variante del metodo Windows RoboCopy ha funzionato:

mkdir c:\empty
robocopy c:\empty toolongdir /purge
rmdir c:\empty
rmdir toolongdir

Sì, ci vuole tempo ma ha fatto il lavoro.


-1

Basta eseguire MS ROBOCOPY come segue:

  1. Creare una "cartella vuota" con lo stesso nome della cartella che contiene la "struttura di directory all'infinito ricorrente".
  2. Esegui il ROBOCOPY dalla riga di comando con l'opzione / MIR.
  3. Al termine della ROBOCOPIA (e potrebbero essere necessari alcuni secondi),
  4. Eliminare la cartella con "l'albero di directory infinitamente ricorrente" che ora è una "cartella vuota".
  5. Andare avanti ed eliminare la "cartella vuota" creata nel passaggio 1.

. . . . . . . . . . . . . . .

ROBOCOPIA "C: \ anyplace \ BADFOLDER" "C: \ ovunque \ BADFOLDER" / MIR

Dove:

C: \ anyplace \ BADFOLDER .. è la "cartella vuota" che hai creato e

C: \ ovunque \ BADFOLDER .. è la cartella in cui si trova "l'albero di directory infinitamente ricorrente".

. . . . . . . . . . . . . . .

Dopo l'esecuzione di ROBOCOPY .. Ora hai due BADFOLDER "vuoti".

Per ripulire, eliminare entrambi

C: \ anyplace \ BADFOLDER e C: \ ovunque \ BADFOLDER

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.