Comment supprimer un dossier imbriqué assez profondément et éviter “Nom de fichier trop long”?

70

Eclipse a créé un dossier temporaire dans l’un des répertoires assez profonds, par exemple

dir1\dir1\dir1\dir1\...

Je ne parviens pas à supprimer ce dossier sous Windows via Explorer, les commandes delou rmdir, ni la commande 'rm' de Cygwin. Comment dois-je supprimer ce très long dossier?

Il n'arrête pas de dire "Nom de fichier trop long ..."

utilisateur39186
la source

Réponses:

105

Si vous êtes comme moi et que vous n'aimez pas installer un logiciel supplémentaire pour résoudre un problème de ce type, j'irais de pair avec la suggestion de XQYZ et l'utiliserai robocopypour résoudre le problème. (Dans mon cas, le problème a été créé par robocopy en premier lieu, en copiant un répertoire contenant des points de jonction récursifs sans fournir / XJ à robocopy).

Pour supprimer l’arborescence commençant par c: \ sousdir \ more \ offending_dir :

Le processus complet, étape par étape, est aussi simple que cela:

  1. cd c:\subdir\more à cd dans son répertoire parent.
  2. mkdir empty créer un répertoire vide.
  3. robocopy empty offending_dir /mir mettre en miroir le répertoire vide dans le répertoire incriminé.
  4. Après avoir attendu, vous avez terminé! Terminez le avec:
  5. rmdir offending_dir se débarrasser du répertoire incriminé maintenant vide et
  6. rmdir empty se débarrasser de votre répertoire vide intermédiaire.
jofafrazze
la source
2
Excellente suggestion. Mon problème a également été créé par Robocopy et, comme vous l'avez décrit, le correctif Robocopy a fonctionné pour moi.
Nathan Garabedian
3
J'ai aussi fait des dégâts avec des robocopypoints de jonction; merci de me montrer comment l'utiliser pour nettoyer le désordre!
Mr.Wizard
mes dossiers n'ont pas été créés par robocopy mais il les a parfaitement supprimés
Sasha
11
Le gestionnaire de package de nœud (NPM) a provoqué ce problème pour moi. Il y avait tellement de paquets imbriqués pour une raison quelconque.
David Sherret
c'est clairement la meilleure et la plus raisonnable des réponses, bien mieux qu'un script batch récursif sur mesure
monastic-panic
39

C'est en fait assez simple à corriger. Dites que la structure de répertoire est en tant que telle:

C:\Dir1\Dir1\Dir1\Dir1…

Pour résoudre ce problème, il suffit de renommer chaque dossier en un nom de dossier d'un caractère jusqu'à ce qu'il ne soit plus trop long à supprimer:

  1. Renommer C:\Dir1enC:\D
  2. Aller vers C:\D\
  3. Renommer C:\D\Dir1enC:\D\D
  4. Aller vers C:\D\D\
  5. Aller à 1 jusqu'à ce que la longueur totale du chemin soit <260

Voici un fichier de commandes pour automatiser le processus (cette version simple est préférable pour des répertoires simples comme celui décrit dans la question, en particulier pour les répertoires jetables). Passez le dossier le plus haut possible (par exemple C:\Dir1pour C:\Dir1\Dir1\Dir1…ou C:\Users\Bob\Desktop\New Folderpour 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

Explication technique

Les autres solutions proposées sont à rebours; vous ne pouvez pas le réparer en allant du répertoire le plus profond vers l'extérieur, vous devez aller dans l'autre sens.

Lorsque vous essayez d'accéder à un répertoire, vous le faites en utilisant son chemin absolu, explicitement ou non, qui inclut tout ce qui le précède. Par conséquent, pour une structure de répertoire semblable à C:\Dir1\Dir1\Dir1\Dir1, la longueur du chemin d'accès au plus intérieur Dir1est de 22. Cependant, la longueur du chemin d'accès au plus externe Dir1n'est que de 7 et est donc toujours accessible quel que soit son contenu (dans le contexte du chemin d'un répertoire donné). , le système de fichiers n’a aucune connaissance de ce qu’il contient ni de l’effet qu’il a sur la longueur totale du chemin de ses répertoires enfants; seulement ses répertoires ancêtres (vous ne pouvez pas renommer un répertoire si la longueur totale du chemin est trop longue).

Par conséquent, lorsque vous rencontrez un chemin trop long, vous devez aller au plus haut niveau possible, le renommer en un nom à un caractère et le répéter pour chaque niveau. Chaque fois que vous le faites, la longueur totale du chemin est raccourcie de la différence entre l'ancien nom et le nouveau nom.

Le contraire est également vrai. Vous ne pouvez pas créer de chemin d'accès supérieur à la longueur maximale prise en charge (sous DOS et Windows MAX_PATH = 260). Cependant, vous pouvez renommer les répertoires, en commençant par le plus externe, en un nom plus long. Le résultat est que les dossiers plus profonds dont le chemin d'accès absolu est> 260 seront inaccessibles. (Cela ne les rend pas "cachés" ou sécurisés, car ils sont assez simples à consulter, aussi n'utilisez pas cette méthode pour cacher des fichiers.)


Note latérale intéressante

Si vous créez des dossiers dans l'Explorateur Windows 7, il peut sembler que l'Explorateur vous autorise à créer des sous-répertoires tels que la longueur totale soit supérieure à MAX_PATH, et en réalité, il l'est, mais il trompe en utilisant "noms de fichiers DOS 8.3". Vous pouvez le voir en créant un arbre tel que:

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

Il est long de 696 caractères, ce qui est bien sûr beaucoup plus long que 260. En outre, si vous accédez au sous-répertoire le plus à l'intérieur de l'explorateur, il s'affiche comme prévu dans la barre d'adresse lorsqu'il n'est pas activé, mais lorsque vous cliquez sur l'adresse. barre, il modifie le chemin C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\, qui ne compte que 102 caractères.

Sous XP, cela n’est pas le cas, il refuse fermement de créer un chemin plus long que celui pris en charge.

Ce qui serait vraiment intéressant, c’est de découvrir comment l’Explorateur Windows 7 gère les «chemins trop longs» lorsque l’ NtfsDisable8dot3NameCreationoption est définie.

Synetech
la source
3
Il est possible de créer un chemin plus long que MAX_PATH, comme expliqué ici . Malheureusement, \\?` doesn't work with rmdir`.
Grawity
@grawity, oui, mais c'est parce que cela fonctionne sous le même principe: un chemin court est renommé en un chemin plus long; cela le fait simplement de manière dynamique en développant une variable plutôt que de la renommer manuellement en une seule variable. Il n'est pas possible de créer un répertoire dont le chemin d'accès absolu est trop long lorsque la commande de création contient suffisamment d'informations pour déterminer la longueur totale.
Synetech
3
@ Synetech: Non, cela fonctionne différemment. Les chemins comme \\?\C:\dir\dir\dir\dirlittéralement dérivation MAX_PATH; il n'y a pas de "variables" impliquées. (Mais comme je l'ai dit, cela ne fonctionne pas avec rmdirou d'autres éléments cmd.exeintégrés pour une raison quelconque.)
grawity
par exemple, essayez de l'exécuter md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Cela ne fonctionnera pas car le système de fichiers dispose d'informations suffisantes pour déterminer que la longueur totale du chemin d'accès serait de 263 caractères.
Synetech
2
(En outre, ne confondez pas la longueur du chemin d'accès avec la longueur du composant . Vous ne pouvez pas avoir un seul répertoire avec un nom de plus de 255 caractères; cependant, vous pouvez avoir un chemin beaucoup plus long que cela.)
grawity
17

Vous pouvez raccourcir le chemin en utilisant substpour créer un lecteur virtuel:

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

Changer dans le lecteur virtuel:

cd Z:

Maintenant, vous pouvez supprimer les fichiers:

del *.*

Retirez le lecteur virtuel:

cd C:\TEMP
subst Z: /d

Supprimer le répertoire:

rd /s dir1
Matthew Simoneau
la source
Nan; cette première commande ne fonctionnera pas si le répertoire est trop long; il renverra le paramètre error Invalid .
Synetech le
2
@ Synetech, bien sûr, mais si vous vous contentez de sous-traiter C:\TEMP\dir1\dir1\dir1, cela en raccourcira une partie, ce qui vous permettra d'entrer. Cela ressemble à votre suggestion de renommer, mais avec un mappage à la place. ;)
Bobson
@Bobson, d'accord tu as raison; +1 pour vous deux. :-)
Synetech
10

J'ai écrit une petite application C # pour m'aider à supprimer une structure très profonde similaire générée par une utilisation négligente de Robocopy et une sauvegarde de Homeserver; Par défaut, Robocopy traite les points communs comme des dossiers normaux ... :-( Vous pourriez vous retrouver avec un gros gâchis sans vous en rendre compte.

Cet outil est disponible sur CodePlex avec des fichiers source, à l’usage de tous.

http://deepremove.codeplex.com

JPJofre
la source
TRAVAUX!!! Cette réponse doit être marquée comme fonctionnant! Le logiciel fonctionne comme du beurre .. a résolu mon problème en quelques secondes !! Je vous remercie!
Rafique Mohammed le
7

Il y a quelque temps, j'ai créé un petit exécutable utilitaire autonome appelé DeleteFiles que vous pouvez utiliser pour effectuer cette tâche facilement.

En utilisant cet utilitaire autonome, vous pouvez simplement faire:

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

pour supprimer toute la structure du dossier. -r récise la hiérarchie des dossiers à partir du répertoire de départ, -f supprime tous les dossiers vides (qui seront tous si vous utilisez . en tant que spécification de fichier). DeleteFiles prend en charge les chemins plus longs que la limite Windows MAX_PATH, de sorte que cela fonctionnera parfaitement sur les dossiers imbriqués.

DeleteFiles est gratuit et à code source ouvert. Vous pouvez récupérer le code binaire ou source de GitHub ou installer directement à l’aide de Chocolatey.

Rick Strahl
la source
Merci, outil génial, ++ pour le mettre dans Chocolatey;) Facilite l'intégration dans un outil CI!
Charles Ouellet
1
Cela a fait le tour. Si vous avez un très long chemin, ajouter > NULà la fin peut accélérer le processus.
Ryscl
La solution robocopy n'a pas fonctionné pour moi ni pour la solution Synetech. DeleteFiles fonctionnait pour moi, mais pour une raison quelconque, je devais l'exécuter trois fois pour que tous les sous-dossiers soient supprimés. En tout cas, cela a résolu mon problème.
Frank le
Re: courir DeleteFiles 3 fois. Je l'ai également constaté. Je pense que cela est dû à certaines particularités de Windows qui verrouillent les dossiers contenant des fichiers pendant une courte période, même une fois que les fichiers ont été supprimés. Plusieurs passes détectent l'échec occasionnel de ce problème dans des sous-dossiers - potentiellement multi-imbriqués. Je vois le même comportement avec Explorer supprime les arbres profonds.
Rick Strahl
5

Simple et facile maintenant

Je faisais face au même problème depuis si longtemps avec node_modules qui a des dossiers très imbriqués. alors finalement fait un script pour réparer ce qui peut supprimer des dossiers en raccourcissant les chemins.

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

npm install fdel -g

fdel ./node_modules
dev.meghraj
la source
Je ne sais pas pourquoi les concepteurs ont choisi d'inclure toutes les dépendances dans une structure alors qu'ils auraient pu la créer avec une structure plate. Donc, ce script était le moyen le plus simple pour moi, car j'utilise déjà node.js
user2610529 le
4

Lorsque je travaillais avec Sikuli, je me suis retrouvé avec une boucle de récursivité Calculator.sikuli dans le programme qui générait une quantité indénombrable de répertoires "calculator.sikuli.calculator.sikuli". Je pourrais déplacer l’arbre, mais le chemin est trop long pour être supprimé.

Après avoir essayé plusieurs solutions avec boucle popd, Scandisk et obtenir (sensiblement) nulle part ...

J'ai écrit ce script pour "aller en profondeur" dans les répertoires récursifs (dans un répertoire appelé "a"), les déplacer (vers un répertoire appelé "b"), puis supprimer l'arborescence tronquée, les déplacer vers l'arrière (vers "a") , et répétez:

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 Utilisé pour supprimer les sous-dossiers infiniment récursifs
  • REM suggère d’arrêter d’abord le service Windows Search (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

Ceci est juste un appel à réexécuter le fichier de commandes.

SiloSix
la source
J'ai passé des heures à étudier cela. Ce fichier .bat est comme un cadeau du ciel. Silo, tu es un ange. xD
Squish
2

Nous avons eu un problème comme celui-ci au travail quand Eclipse a décidé de créer des ordures sur les disques durs. Nous l'avons corrigé en utilisant la fonction / MIR de robocopy pour refléter un répertoire vide dans le répertoire imbriqué.

XQYZ
la source
1

Je voudrais essayer d'ouvrir une invite de commande et en cours d'exécution:

rmdir /s <directory>

Si cela ne fonctionne pas, je cd à mi-chemin dans l'arborescence de répertoires et essayer de supprimer un sous-ensemble des répertoires - disons les 20 répertoires les plus internes - puis de m'en sortir.

Jesse S.
la source
1
J'ai essayé votre suggestion ci-dessus et il dit toujours "Le répertoire n'est pas vide" quand
j'exécute
1
C'est parce que cette méthode est à l'envers. ;-)
Synetech
1

S'il s'agit d'un dossier réseau, partagez simplement le répertoire parent de ce répertoire et mappez-le sur un lecteur de votre ordinateur local, puis supprimez votre dossier.

Punnakadu
la source
21966 [main] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: erreur de base - erreur interne lors de la lecture de l'environnement Windows - trop de variables d'environnement?
user39186
J'ai essayé de déplacer un sous-dossier imbriqué de 20 niveaux et j'ai eu l'erreur ci-dessus
user39186
1

Ouvrez une invite de commande.

Naviguez jusqu'au dossier / répertoire qui contient le plus grand 'dir1' (nous supposerons C: \)

c:\> RD /s dir1

Modifier (après les commentaires ajoutés) :

Autres idées:

MS offre des informations sur la façon de traiter le problème (beaucoup d'idées à essayer) ici .

Il y a aussi cet outil (jamais utilisé personnellement) - TooLongPath .

Peut-être écrire quelque chose (puisque vous avez Eclipse) qui navigue à fond puis revient en arrière un niveau de dossier à la fois, en le supprimant au fur et à mesure?

Ƭᴇcʜιᴇ007
la source
1
J'obtiens les 3 erreurs suivantes en utilisant la commande ci-dessus.Le répertoire n'est pas vide Le système ne trouve pas le chemin spécifié. Le nom du fichier est trop long
user39186
J'ai essayé de traverser say 'n' level deep et d'utiliser la même commande, mais cela ne semble pas aider
user39186
cela a fonctionné pour moi sur win7! merci
leoh
1

Une autre solution: téléchargez Total Commander. C'est un programme très utile, pas seulement parce que c'est un long fichier sensible.

La version non enregistrée est Nagware mais entièrement fonctionnelle, elle fera le travail.

Loren Pechtel
la source
1

Cela peut être fait directement à partir de la ligne de commande ou dans un fichier de commandes en construisant un chemin UNC vers le répertoire que vous souhaitez supprimer.

alors au lieu de

rmdir /s/q c:\mydirectory

utilisation

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

Les chemins de style UNC comme celui-ci peuvent être beaucoup plus longs et contourner la limite de 260 caractères.

Steve Cooper
la source
Ça ne marche pas 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 bits.
Victor
Ne fonctionne pas pour Windows 10. Encore trop longtemps.
BananaAcid
La version `\\?` A fonctionné pour moi sur Windows 10!
Peter
0

Lorsque j'ai ce problème, je renomme simplement certains noms de dossiers beaucoup plus courts, puis une fois que le chemin d'accès total est suffisamment court, vous supprimez OK. Aucun outil supplémentaire nécessaire.

music2myear
la source
Oui, mais comme je l'ai dit, vous devez travailler de l'extérieur, sinon cela ne fonctionnera pas.
Synetech
Bien sûr. J'ai généralement trouvé que les noms de dossiers les plus longs ont tendance à être les premiers (dans les dossiers de correctifs) ou les derniers. La plupart du temps, il vous suffit de changer un ou deux noms de dossier pour le faire à la bonne longueur.
music2myear
Oui, mais si vous commencez par le plus intime, cela ne fonctionnera pas car la rencommande échouera avec path too long.
Synetech
1
Oui, les scripts fournis ci-dessus sont une méthode intelligente et efficace pour traiter ce problème automatiquement. Cela ne m'est arrivé que quelques fois et j'ai donc simplement utilisé le processus de changement de nom manuel. Pour ce faire, je commence simplement à renommer la structure de dossiers là où je me trouve dans l'arborescence incriminée. Mon expérience est que les noms de dossiers les plus longs apparaissent plus souvent au début ou à la fin de la structure d'arborescence. Ma réponse est donc valable, bien que probablement pas la plus forte ni la plus intelligente ici. Cela ne vaut pas un vote négatif.
music2myear
> Je commence simplement à renommer la structure de dossiers là où je me trouve dans l'arborescence incriminée. Eh bien, oui, si vous êtes déjà dans l'arborescence, vous pouvez certainement renommer au moins ce dossier (vous devrez aller à son parent). ; vous pourrez peut-être également renommer un sous-dossier, mais cela risque d’être trop long.
Synetech
0

J'ai eu le même problème, sauf qu'il a été créé par une tâche de sauvegarde Cobian récursive. Il s'avère que le logiciel gratuit Cobian inclut une application Deleter qui permet de supprimer très rapidement ces dossiers imbriqués embêtants.

Il est situé sous le menu Outils.

mrshl
la source
0

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://gitlab.imanolbarba.net/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.

Imanol Barba Sabariego
la source
-3

Votre système de fichiers est peut-être corrompu. Exécutez chkdsk pour voir s’il répare quoi que ce soit, puis essayez de supprimer le dossier.

jongleur
la source
Non, ce n'est pas le problème. Le problème est que la longueur totale du chemin est plus longue que celle supportée ( MAX_PATH=255). Cela peut se produire même avec un système de fichiers non corrompu.
Synetech
L'exécution de chkdsk sur le dossier m'a donné l'erreur suivante. Le lecteur, le chemin ou le nom du fichier n'est pas valide
utilisateur39186