D'une manière ou d'une autre, l'une de nos anciennes boîtes Server 2008 (et non R2) a développé un dossier apparemment infiniment récursif. Cela nuit à nos sauvegardes, car l’agent de sauvegarde tente de rentrer dans le dossier et ne revient jamais.
La structure du dossier ressemble à ceci:
C:\Storage\Folder1
C:\Storage\Folder1\Folder1
C:\Storage\Folder1\Folder1\Folder1
C:\Storage\Folder1\Folder1\Folder1\Folder1
... etc. C'est comme un de ces ensembles de Mandelbrot avec lesquels nous jouions tous dans les années 90.
J'ai essayé:
- Suppression de l'explorateur. Oui, je suis optimiste.
RMDIR C:\Storage\Folder1 /Q/S
- cela retourneThe directory is not empty
ROBOCOPY C:\temp\EmptyDirectory C:\Storage\Folder1 /PURGE
- Cela passe dans les dossiers pendant quelques minutes avant que robocopy.exe ne se bloque.
Quelqu'un peut-il suggérer un moyen de tuer ce dossier pour de bon?
/MIR
plutôt: celaROBOCOPY /MIR C:\temp\EmptyDirectory C:\Storage\Folder1
peut aussi valoir la peine de courir unchkdsk
peu pour rire./MIR
semblait durer plus longtemps, mais a finalement été bombardé aussi ("robocopy a cessé de fonctionner"). J'ai un peu peur de faire çachkdsk
; c'est un assez vieux serveur et je crains que ce problème ne soit révélateur de problèmes de système de fichiers plus importants ...find
pour supprimer le premier répertoire en profondeur:find Storage/Folder1 -depth -exec rmdir {} \;
Réponses:
Merci à tous pour les conseils utiles.
Bien loin du territoire de StackOverflow, j'ai résolu le problème en mélangeant cet extrait de code C #. Il utilise la bibliothèque Delimon.Win32.IO qui traite spécifiquement des problèmes d’accès aux chemins de fichiers longs.
Au cas où cela pourrait aider quelqu'un d'autre, voici le code - il a traversé les ~ 1600 niveaux de récursion avec lesquels j'avais été bloqué et a pris environ 20 minutes pour les supprimer tous.
la source
.Delete
(au lieu de laSystem.IO
version normale ), et bien qu'il ne lève aucune exception, il ne semble rien faire. Certes, la récursivité utilisant la méthode ci-dessus a pris un temps fou et.Delete
n'a mordu que 5 à 10 secondes. Peut-être a-t-il grignoté quelques annuaires puis abandonné?Pourrait être un point de jonction récursif. Une telle chose peut être créée avec
junction
un utilitaire de fichiers et de disques de Sysinternals .Et vous pouvez maintenant descendre sans fin c: \ Hello \ Hello \ Hello .... (jusqu'à atteindre MAX_PATH, 260 caractères pour la plupart des commandes mais 32 767 caractères pour certaines fonctions de l'API Windows).
Une liste de répertoires indique qu'il s'agit d'une jonction:
Pour supprimer, utilisez l'utilitaire de jonction:
la source
DIR
répertoires me montre tout simplement les répertoires - rien nejunction -s C:\Storage\Folder1
?No reparse points found
:(dir /a
pour voir '<JONCTION>' sans spécifier le nom spécifique.Pas une réponse, mais je n'ai pas assez de représentant pour un commentaire.
Une fois, j'ai résolu ce problème sur un disque alors énorme de 500 Mo FAT16 sur un système MS-DOS. J'ai utilisé le débogage DOS pour vider et analyser manuellement la table des répertoires. J'ai ensuite retourné un bit pour marquer le répertoire récursif comme supprimé. Mon exemplaire de «Référence des programmeurs DOS» de Dettman et Wyatt m'a montré la voie.
Je suis toujours excessivement fier de cela. Je serais étonné et terrifié s’il existe un outil polyvalent aussi puissant sur les volumes FAT32 ou NTFS. La vie était plus simple à l'époque.
la source
Java peut également traiter de longs chemins de fichiers. Et cela peut aussi être beaucoup plus rapide. Ce code (que j'ai copié de la documentation de l'API Java) supprime une structure de répertoires profonds de 1 600 niveaux en environ 1 seconde (sous Windows 7, Java 8.0) et ne présente aucun risque de débordement de pile car il n'utilise pas de récursion.
la source
Vous n'avez pas besoin de longs chemins d'accès si vous entrez
chdir
dans le répertoire et utilisez simplement des chemins d'accès relatifs àrmdir
.Ou, si vous avez un shell POSIX installé, ou portez-le à l’équivalent DOS:
(Utiliser une variable shell pour savoir où vous l'avez renommé pour la condition de boucle constitue l'autre alternative pour dérouler la boucle comme je l'ai fait ici.)
Cela évite la surcharge de temps processeur de la solution de KenD, qui oblige le système d'exploitation à parcourir l'arborescence du haut au
n
troisième niveau à chaque fois qu'un nouveau niveau est ajouté, en vérifiant les autorisations, etc. Il a donc unesum(1, n) = n * (n-1) / 2 = O(n^2)
complexité temporelle. Les solutions qui réduisent une partie du début de la chaîne doivent l'êtreO(n)
, sauf si Windows doit traverser une arborescence lors du changement de nom de son répertoire parent. (Linux / Unix non.) Des solutionschdir
allant jusqu'au bas de l'arborescence et utilisant des chemins relatifs à partir de là, supprimant les répertoires lors de lachdir
sauvegarde, devraient également l'êtreO(n)
, à condition que le système d'exploitation n'ait pas besoin de vérifier tous vos fichiers. répertoires parents chaque appel système, lorsque vous faites quelque chose sur CD.find Folder1 -depth -execdir rmdir {} +
exécutera rmdir tant qu’il sera CDé dans le répertoire le plus profond. Ou en fait, l'-delete
option de find fonctionne sur les répertoires et implique-depth
. Alorsfind Folder1 -delete
devrait faire exactement la même chose, mais plus rapidement. Ouais, GNU find sur Linux descend en parcourant un répertoire, CD-ROM dans des sous-répertoires avec des chemins relatifs, puisrmdir
avec un chemin relatif, puischdir("..")
. Il ne réanalyse pas les répertoires lors d'une ascension, il consomme donc de laO(n)
RAM.C'était vraiment une approximation:
strace
montre qu'il utilise EFFECTIVEMENTunlinkat(AT_FDCWD, "tmp", AT_REMOVEDIR)
,open("..", O_DIRECTORY|...)
etfchdir(the fd from opening the directory)
, avec un tas d'fstat
appels mélangés aussi. Mais l'effet est le même si l'arborescence de répertoires n'est pas modifiée pendant que find est en cours d'exécution.edit: Juste pour le plaisir, j’ai essayé ceci sous GNU / Linux (Ubuntu 14.10, sur un processeur Core2Duo de première génération à 2,4 GHz, sur un système de fichiers XFS sur un lecteur WD 2.5TB Green Power (WD25EZRS)).
(mkdir -p crée un répertoire et tous les composants de chemin manquants).
Oui, vraiment 0,05 seconde pour 2k opérations rmdir. xfs est assez bon pour regrouper les opérations de métadonnées dans le journal, car elles ont corrigé les opérations de métadonnées comme étant lentes il y a 10 ans.
Sur ext4, create prenait 0m0.279s, supprimer avec find prenait toujours 0m0.074s.
la source
J'ai rencontré le même problème que certaines applications Java avec un désordre de dossiers de plus de 5000 répertoires et j'ai écrit un programme qui vous aidera à supprimer ce dossier. Le code source complet se trouve dans ce lien:
https://imanolbarba.net/gitlab/imanol/DiREKT
Il a tout supprimé après un moment, mais il a réussi à faire le travail. J'espère que cela aidera les gens qui (comme moi) rencontrent le même problème frustrant.
la source
Moi aussi, je l’avais sur un système autonome Windows 10. C: \ Utilisateur \ Nom \ Répéter \ Répéter \ Répéter \ Répéter \ Répéter \ Répéter \ Répéter \ Répéter \ Répéter apparemment à l'infini.
Je pouvais naviguer à l’aide de Windows ou d’Invite de commandes jusqu’à la cinquantième, sans plus. Je ne pouvais pas le supprimer, ni cliquer dessus, etc.
C étant ma langue, j’ai finalement écrit un programme avec une boucle d’appels système, qui se répètent jusqu’à leur échec. Vous pouvez le faire dans n’importe quelle langue, même en batch DOS. J'ai créé un répertoire appelé tmp et déplacé Repeat \ Repeat dans celui-ci, supprimé le dossier Repeat maintenant vide et déplacé tmp \ Repeat dans le dossier actuel. Encore et encore!
ChkSystem lance simplement un appel system () et vérifie la valeur de retour, en s'arrêtant en cas d'échec.
Fait important, il a échoué à plusieurs reprises. Je pensais que mon programme ne fonctionnait peut-être pas ou qu'il était infiniment long après tout. Cependant, j'avais déjà eu cela auparavant avec des appels système, avec des choses qui ne se synchronisaient pas, alors j'ai juste relancé le programme et il a continué là où il s'était arrêté, alors ne pensez pas tout de suite que votre programme ne fonctionne pas. Donc au total, après l'avoir exécuté environ 20 fois, il les a tous effacés. Au total, il s'agissait à l'origine d'environ 1280 dossiers. Aucune idée de ce qui l'a causé. Fou.
la source