web-dev-qa-db-fra.com

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

Eclipse a créé un dossier temporaire dans l’un des répertoires qui est imbriqué assez profondément, par exemple.

dir1\dir1\dir1\dir1\...

Je ne parviens pas à supprimer ce dossier dans Windows via l'Explorateur, ni les commandes del ou 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 ..."

67
user39186

Si vous êtes comme moi et que vous n'aimez pas installer de logiciel supplémentaire pour résoudre un problème de ce type, je vous invite à suivre la suggestion de XQYZ et à utiliser robocopy pour 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 à partir de c:\subdir\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 pour créer un répertoire vide.
  3. robocopy empty offending_dir /mir pour refléter le répertoire vide dans le répertoire incriminé.
  4. Après avoir attendu, vous avez terminé! Terminez le avec:
  5. rmdir offending_dir pour supprimer le répertoire incriminé maintenant vide et
  6. rmdir empty pour vous débarrasser de votre répertoire vide intermédiaire.
100
jofafrazze

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. Renommez C:\Dir1 en C:\D
  2. Accédez à C:\D\
  3. Renommez C:\D\Dir1 en C:\D\D
  4. Accédez à C:\D\D\
  5. Aller à 1 jusqu'à ce que la longueur totale du chemin soit <260

Voici un fichier de commandes permettant d’automatiser le processus (cette version simple est préférable pour les 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:\Dir1 pour C:\Dir1\Dir1\Dir1… ou C:\Users\Bob\Desktop\New Folder pour 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 telle que C:\Dir1\Dir1\Dir1\Dir1, la longueur du chemin menant au Dir1 le plus intérieur est 22. Cependant, la longueur du chemin menant au Dir1 le plus externe n’est que de 7 et est donc toujours accessible quel que soit son contenu (dans le contexte d’une étant donné le chemin du répertoire, 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. 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 comporte 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 change le chemin en 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’option NtfsDisable8dot3NameCreation est définie.

38
Synetech

Vous pouvez raccourcir le chemin en utilisant subst pour 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
16
Matthew Simoneau

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 ordinaires ... :-( 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

10
JPJofre

Il y a quelque temps, j'ai créé un petit 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 . comme spécification de fichier). DeleteFiles prend en charge les chemins plus longs que la limite Windows MAX_PATH, de sorte que cela fonctionnera sans problème pour les dossiers profondément imbriqués.

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

7
Rick Strahl

Simple & Easy Now

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
5
dev.meghraj

Pendant que 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 nom du 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.

4
SiloSix

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é.

2
XQYZ

Ouvrez une invite de commande.

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

c:\> RD /s dir1

Éditer (après l'ajout de commentaires)}:

Autres idées:

MS offre des informations sur la façon de traiter le problème (de nombreuses 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?

1
Ƭᴇcʜιᴇ007

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 de répertoires - disons les 20 répertoires les plus internes - puis de m'en sortir.

1
Jesse S.

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.

1
Punnakadu

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.

1
Loren Pechtel

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 tels que celui-ci peuvent être beaucoup plus longs et contourner la limite de 260 caractères.

1
Steve Cooper

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

Il est situé sous le menu Outils.

0
mrshl

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.

0
music2myear

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 plus profonds 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.

0