Comment supprimer une arborescence de répertoires récurrente à l'infini?

9

Sur l'un de nos serveurs de fichiers Windows 2003, quelqu'un ou quelque chose a réussi à créer des arborescences de répertoires infiniment récurrentes dans certains des dossiers de départ des utilisateurs, et ils ne peuvent pas être supprimés.

Vous vous retrouvez avec quelque chose comme ça:

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

Et ça continue infiniment pour autant que je sache.

Si vous essayez de supprimer l'arborescence de répertoires du système sur lequel elle réside, "Erreur lors de la suppression du fichier ou du dossier: impossible de supprimer le fichier:". Essayer de le supprimer d'un système Windows 7 connecté au partage réseau entraîne une erreur «dossier en cours d'utilisation».

Si vous naviguez dans l'arborescence des répertoires aussi loin que vous le faites, vous atteignez finalement un répertoire qui ne peut pas être ouvert ou supprimé (si vous cliquez avec le bouton droit, aucune des options standard n'apparaît), cependant si vous essayez d'ouvrir le même répertoire à partir d'un partage sur un autre système il peut être ouvert, mais l'Explorateur Windows devient extrêmement lent.

J'ai essayé les suggestions de cet article, ainsi que le démarrage du serveur avec un disque Linux et en essayant de rm -rf le répertoire, ni travaillé.

C'est un mystère.

Edit: je pourrais également ajouter qu'il est possible de renommer les répertoires, mais pas de les supprimer.

EnglishInfix
la source
1
Un problème similaire a été résolu sur la défaillance du serveur .
Lilienthal

Réponses:

14

J'avais également un dossier récursif sans fin qui avait été créé par un IDE java, et je n'ai pas pu le supprimer dans l'Explorateur Windows ou à l'invite cmd.

Cependant, lorsque j'ai installé git, j'ai également installé git-bash. Dans git-bash, vous pouvez lancer la commande:

rm -rfd recursive_folder_name

et il s'en occupera.

cdjohnk
la source
Remarque importante: cela peut prendre énormément de temps ... Faites une pause, mangez quelque chose, buvez un café et laissez l'outil Unix faire son travail;) Étonnamment, cela fonctionne
Antwane
fonctionne également si vous utilisez un linux basé sur vmware et montez le lecteur (s'il est externe ...)
Wolfgang Fahl
4

Il est possible qu'il y ait un lien symbolique vers un dossier quelque part, probablement le deuxième studentsur votre chemin.

Essayez d'exécuter la commande:

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

et voyez s'il studentest marqué comme DIR ou SYMLINK / JUNCTION.

Par exemple, il s'agit d'une sortie typique de la dircommande:

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

Vous voyez que les deux premières entrées sont marquées comme DIR, tandis que la troisième (un lien symbolique vers un autre dossier) est marquée comme SYMLINKD. Dans votre cas (Windows 2003), je pense qu'il y a des JUNCTIONs au lieu des SYMLINKs.

Si le studentdossier est un lien ou une jonction symbolique, exécutez les commandes:

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

et ainsi se débarrasser de la récursivité.

Cristian Lupascu
la source
Aucun des répertoires n'est un lien symbolique, j'ai vérifié le premier couple plus celui à la "fin" où il est bloqué.
EnglishInfix
2

Il est possible que la personne qui travaillait dans ce dossier parvienne à créer un point de jonction qui effectue une boucle de user.nameà servername, créant ainsi une arborescence de répertoires de `` boucle infinie ''.

Les jonctions sont une fonctionnalité du système de fichiers NTFS qui vous permet de créer un lien symbolique vers un répertoire qui fonctionne comme un alias vers le répertoire. http://en.wikipedia.org/wiki/NTFS_junction_point

Vous pouvez voir sous la section "Effets observés" de la page wiki le problème que vous décrivez.

Essayez d'exécuter cet utilitaire pour répertorier les jonctions sous ce serveur:

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

Il devrait également vous permettre de supprimer le point de jonction.

Justin Pearce
la source
2

J'ai eu un problème similaire quand eclipse a créé une arborescence de dossiers massivement profonde que je ne pouvais pas supprimer. Cependant, comme il était possible de déplacer et de renommer des dossiers, j'ai écrit un fichier batch pour qu'il fonctionne dans l'arborescence en supprimant les dossiers un par un et cela a fonctionné! Pour une arborescence de dossiers apparemment infiniment profonde de FOLDERNAME dans le répertoire C, c'est-à-dire

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

Fichier batch:

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

Cela fonctionne car TEMPFOLDERNAME est maintenant un arbre de longueur finie (un seul dossier sans rien) et l'arborescence massive de FOLDERNAME a un dossier de moins à chaque fois que la boucle est exécutée, atteignant finalement le bas en supprimant un dossier en haut.

JohnO
la source
1

J'ai rencontré le même problème avec un désordre de dossier de plus de 5000 répertoires que certaines applications Java et j'ai écrit ceci:

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

Il a supprimé le tout après un certain temps, mais il a réussi à faire le travail, j'espère que cela aide les gens qui (comme moi), rencontrent le même problème frustrant

Imanol Barba Sabariego
la source
1

Résolu mes répertoires de boucle sans fin avec ce 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
Schollbert
la source
0

J'ai eu le même problème. Le dossier que je voulais supprimer contenait une arborescence sans fin de liens vers le même nom et chaque tentative de suppression faisait que Windows lançait une erreur "Fichier trop long ...". Il a échoué quelle que soit la commande que j'ai essayée, y compris toutes les méthodes ci-dessus, j'ai donc essayé la commande "rm" de Cygwin dans une fenêtre cmd juste au-dessus du dossier en question. J'ai entré "rm -r -f [dossier]" et le dossier a été supprimé sans se plaindre.

Vous pouvez télécharger Cygwin gratuitement sur https://cygwin.com/install.html . Il s'agit essentiellement d'un shell UNIX pour Windows qui contient toutes les commandes courantes (par exemple, ls, rm, du et cat), mais possède également une tonne de packages qui, si tous étaient téléchargés, prendraient environ 1 Go d'espace. Je crois que le package de téléchargement par défaut comprend les commandes UNIX. Sinon, ils sont dans le bundle "utils" si la mémoire est bonne.

REMARQUE: vous n'avez pas besoin d'exécuter les commandes Cygwin dans sa fenêtre shell bash native. Ils peuvent être exécutés dans une fenêtre cmd en ajoutant le chemin du répertoire "bin" de cygwin à la variable d'environnement PATH de votre système. Dans mon cas, j'ai ajouté "C: \ cygwin64 \ bin".

J'espère que ça aide.

Cal
la source
0

J'ai le même problème ici.

Dans d'autres articles, il a été suggéré de mettre en miroir un dossier vide pour cibler le dossier via le partage réseau avec MS RoboCopy.

Au bon moment, je lance ceci, avec "> nul" pour accélérer (ça le fait, vraiment):

"C: \ TEMP" est un dossier vide et "W: \ TMP" est le dossier affecté :

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

davidmarquesneves
la source
1
Bienvenue dans Super User. Si vous citez une solution venue d'ailleurs, veuillez inclure l'attribution et un lien pour une lecture plus approfondie. Les réponses sont destinées à être des solutions définitives. Si vous êtes toujours en train d'essayer, il peut être prématuré de publier.
fixer1234
0

Moi aussi, je l'avais, sur un système Windows 10 autonome. C: \ Utilisateur \ Nom \ Répéter \ Répéter \ Répéter \ Répéter \ Répéter \ Répéter \ Répéter apparemment à l'infini.

Selon l'OP, je pouvais naviguer en utilisant Windows ou l'invite de commande vers le 50e et pas plus. Je n'ai pas pu le supprimer, ni cliquer dessus, etc. exactement comme décrit.

C est ma langue donc j'ai finalement écrit un programme avec une boucle d'appels système, qui se répètent jusqu'à ce qu'ils échouent. Selon le code DOS de JohnO, j'ai créé un répertoire appelé tmp et déplacé Repeat \ Repeat dans celui-ci, supprimé le dossier Repeat maintenant vide et replacé tmp \ Repeat dans le dossier actuel. Encore et encore!

 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 exécute simplement un appel system () et vérifie la valeur de retour, s'arrêtant en cas d'échec.

Surtout, il a échoué plusieurs fois. Je pensais que mon programme ne fonctionnait peut-être pas ou qu'il était infiniment long après tout. Cependant, j'ai déjà eu cela avec des appels système, avec des choses qui ne se synchronisent pas, alors j'ai simplement exécuté à nouveau le programme et il a continué là où il s'était arrêté, alors ne pensez pas que votre programme ne fonctionne pas. Au total, après l'avoir exécuté environ 20 fois, il les a tous effacés. Au total, il était à l'origine d'environ 1280 dossiers. Aucune idée de ce qui l'a causé. Fou.

DenM
la source
0

Avec des répertoires en boucle à 3 niveaux:

: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
JMi
la source
Explication pour accompagner le code? <:: ;; :: ;; :: ;; :: ;;: :( | XXXX |) o ~
Pimp Juice IT
0

Je l'ai corrigé en exécutant chkdsk / f via la console d'administration, redémarré puis utilisé la suppression de l'explorateur de fichiers. Bien que Windows se soit plaint du long fichier / dossier, il s'est débarrassé du dossier récursif problématique une fois que j'ai confirmé la suppression.

Je ne sais pas s'il y a d'autres problèmes que j'ai pu créer en utilisant l'ancienne option chkdsk dans mon système de fichiers Windows 7 Pro.

Laks
la source
0

Pour moi, cette variation de la méthode Windows RoboCopy a fonctionné:

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

Oui, cela prend du temps mais a fait le travail.

Dimitar II
la source
-1

Exécutez simplement MS ROBOCOPY comme suit:

  1. Créez un "dossier vide" portant le même nom que le dossier contenant "l'arborescence de répertoires infiniment récurrents".
  2. Exécutez la ROBOCOPIE à partir de la ligne de commande avec l'option / MIR.
  3. Une fois la ROBOCOPIE terminée (et cela peut prendre quelques secondes),
  4. Supprimez le dossier avec «l'arborescence de répertoires infiniment récurrents» qui est maintenant un «dossier vide».
  5. Allez-y également et supprimez le "dossier vide" que vous avez créé à l'étape 1.

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

ROBOCOPIE "C: \ anyplace \ BADFOLDER" "C: \ where \ BADFOLDER" / MIR

Où:

C: \ anyplace \ BADFOLDER .. est le "dossier vide" que vous avez créé, et

C: \ partout \ BADFOLDER .. est le dossier où se trouve "l'arborescence de répertoires infiniment récurrents".

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

Après l'exécution de ROBOCOPY .. Vous avez maintenant deux BADFOLDERS "vides".

Pour nettoyer, supprimez les deux

C: \ anyplace \ BADFOLDER et C: \ where \ BADFOLDER

R. Serpkenci
la source