Question Comment supprimer un dossier qui est 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 ex.

dir1\dir1\dir1\dir1\...

Je ne peux pas supprimer ce dossier dans Windows via Explorer, le del ou rmdir commandes, ni la commande Cygwin 'rm'. Comment dois-je supprimer ce très long dossier?

Il ne cesse de dire "Nom de fichier trop long ..."


64
2018-03-11 04:30


origine


duplicata possible de Impossible de supprimer le dossier. Des dossiers en boucle infinie créés les uns dans les autres - bwDraco


Réponses:


Si vous êtes comme moi et que vous n'aimez pas installer de logiciel supplémentaire pour résoudre un problème comme celui-ci, La suggestion de XQYZ et utilise robocopy résoudre le problème. (Dans mon cas, le problème a été créé par robocopy en premier lieu, en copiant un répertoire qui contenait 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 créer un répertoire vide.
  3. robocopy empty offending_dir /mir pour mettre en miroir le répertoire vide dans le répertoire incriminé.
  4. Après quelques temps d'attente, vous avez terminé! Terminez avec:
  5. rmdir offending_dir pour se débarrasser du répertoire offensant maintenant vide et
  6. rmdir empty pour se débarrasser de votre répertoire vide intermédiaire.

93
2018-06-12 21:27



Excellente suggestion Mon problème a également été créé par robocopy et, comme vous l'avez décrit, le correctif robocop a fonctionné pour moi. - Nathan Garabedian
J'ai aussi fait un gâchis avec robocopy et points de jonction; Merci de m'avoir montré comment l'utiliser pour nettoyer les dégâts! - Mr.Wizard
mes dossiers n'ont pas été créés par robocopy mais ils les ont parfaitement enlevés - Sasha
Le gestionnaire de package de noeud (NPM) a causé 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 meilleure qu'un script de lot récursif sur mesure - monastic-panic


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

C:\Dir1\Dir1\Dir1\Dir1…

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

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

Voici un fichier batch pour automatiser le processus (cette version simple est la meilleure pour les répertoires simples comme celui décrit dans la question, en particulier pour les répertoires jetables). Passez le plus haut dossier possible (par ex. C:\Dir1 pour 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 en arrière; vous ne pouvez pas résoudre le problème en allant du répertoire le plus interne vers l'extérieur, vous devez aller dans l'autre direction.

Lorsque vous essayez d'accéder à un répertoire, vous le faites en utilisant son chemin absolu, explicitement ou non, ce qui inclut tout ce qui l'a précédé. Par conséquent, pour une structure de répertoire comme C:\Dir1\Dir1\Dir1\Dir1, la longueur du chemin vers l'intérieur Dir1 est 22. Cependant, la longueur du chemin vers l'extérieur Dir1 est seulement 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 ou de l'effet qu'il a sur la longueur totale du chemin de ses répertoires enfants) 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, il vous faut aller au plus haut niveau possible et le renommer en un seul caractère et le répéter pour chaque niveau. Chaque fois que vous le faites, la longueur totale du chemin est réduite par la différence entre l'ancien nom et le nouveau nom.

Le contraire est vrai aussi. Vous ne pouvez pas créer un chemin supérieur à la longueur maximale prise en charge (sous DOS et Windows). MAX_PATH = 260). Toutefois, vous pouvez renommer les répertoires, en partant de l’extérieur, vers un nom plus long. Le résultat est que des dossiers plus profonds dont le chemin absolu est> 260 seront inaccessibles. (Cela ne les rend pas "cachés" ou sécurisés, car ils sont assez simples pour y accéder, donc n'utilisez pas cette méthode pour masquer 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 permet de créer des sous-répertoires tels que la longueur totale soit supérieure à MAX_PATH, et en effet, il est en fait en train de tricher en utilisant "les noms de fichiers DOS 8.3". Vous pouvez le voir en créant un arbre tel que celui-ci:

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 naviguez vers le sous-répertoire le plus interne de l'explorateur, il s'affiche comme prévu dans la barre d'adresse lorsqu'il n'est pas mis au point. bar, il change le chemin vers 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.

Dans XP, il ne le fait pas, il refuse fermement de créer un chemin plus long que celui qui est pris en charge.

Ce qui serait vraiment intéressant, c'est de savoir comment Windows 7 Explorer gère les "chemins trop longs" NtfsDisable8dot3NameCreation l'option est définie.


38
2018-03-11 05:49



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 qu'il fonctionne sous le même principe: un chemin court est renommé en un plus long; cela se fait de manière dynamique en développant une variable au lieu de la renommer manuellement en une seule. Il est impossible de créer un répertoire dont le chemin absolu est trop long lorsque la commande de création contient suffisamment d'informations pour déterminer la longueur totale. - Synetech
@ Synetech: Non, cela fonctionne différemment. Des chemins comme \\?\C:\dir\dir\dir\dir Littéralement contourne MAX_PATH; il n'y a pas de "variables" impliquées. (Mais comme je l'ai dit, ça ne marche pas avec rmdir ou autre cmd.exe Builtins pour une raison quelconque.) - grawity
par exemple, essayez de courir md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789  Cela ne fonctionnera pas car le système de fichiers dispose de suffisamment d'informations pour déterminer que la longueur totale du chemin serait de 263 caractères, de sorte qu'il échoue. - Synetech
(Aussi, ne confondez pas le chemin longueur avec composant longueur. Vous ne pouvez pas avoir un répertoire unique avec un nom de plus de 255 caractères; cependant, vous pouvez avoir un chemin beaucoup plus longtemps que cela.) - grawity


Vous pouvez raccourcir le chemin en utilisant subst 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 *.*

Supprimez le lecteur virtuel:

cd C:\TEMP
subst Z: /d

Supprimez le répertoire:

rd /s dir1

16
2017-09-06 15:12



Nan; cette première commande ne fonctionnera pas si le répertoire est trop long; il retournera l'erreur Paramètre invalide. - Synetech
@Synetech, bien sûr, mais si vous ne faites que C:\TEMP\dir1\dir1\dir1, alors il en raccourcira une partie, vous permettant ainsi d'entrer. Il est juste comme votre suggestion de renommer, mais avec le mapping à la place. ;) - Bobson
@Bobson, tu as raison +1 pour vous deux. :-) - Synetech


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

L'outil est disponible chez CodePlex avec les fichiers source, pour tous les utilisateurs.

http://deepremove.codeplex.com


10
2018-04-16 01:36



TRAVAUX!!! Cette réponse doit être marquée comme fonctionnante! Le logiciel fonctionne comme du beurre .. résolu mon problème en quelques secondes !! Je vous remercie! - Rafique Mohammed


Il y a quelque temps, j'ai créé un petit exécutable utilitaire autonome appelé Supprimer les fichiers 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 des dossiers. -r récidive la hiérarchie des dossiers du répertoire de départ, -f supprime tous les dossiers vides (qui seront tous si vous utilisez . comme la filepec). DeleteFiles prend en charge les chemins plus longs que la limite Windows MAX_PATH, de sorte qu'il fonctionnera correctement sur les dossiers profondément imbriqués.

DeleteFiles est gratuit et open source et vous pouvez récupérer le code binaire ou le code source de GitHub ou installer directement en utilisant Chocolaté


7
2018-03-26 00:19



Merci, outil génial, ++ pour le mettre en chocolat;) Facilite l'intégration dans un outil CI! - Charles Ouellet
Cela a fait l'affaire. Si vous avez un très long chemin, ajouter > NUL jusqu'à la fin peut rendre le processus plus rapide. - ryascl
La solution robocopy n'a pas fonctionné pour moi ni pour la solution de Synetech. DeleteFiles a fonctionné pour moi, mais pour une raison quelconque, j'ai dû 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
Re: exécuter DeleteFiles 3 fois. J'ai vu cela aussi - je crois que cela est dû à certaines quirks Windows qui bloquent les dossiers contenant des fichiers pendant une courte période, même une fois les fichiers supprimés. Les passages multiples interceptent les défaillances occasionnelles de ce problème dans les sous-dossiers - potentiellement multi-imbriqués. Je vois le même comportement avec les suppressions de l'Explorateur d'arbres profonds. - Rick Strahl


Simple et facile maintenant

Je faisais face à ce même problème depuis si longtemps avec node_modules qui contient des dossiers très imbriqués. donc finalement fait un script pour corriger ce qui peut supprimer des dossiers en raccourcissant les chemins.

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

npm install fdel -g

fdel ./node_modules

5
2018-02-02 14:20



Bien fait! Merci - Erasmus777
Je ne sais pas pourquoi les concepteurs ont choisi d'inclure toutes les dépendances dans une structure quand elles pouvaient être réalisées avec une structure plate. Donc, ce script était le moyen le plus simple pour moi car j'utilise déjà node.js - user2610529


Pendant que je travaillais avec Sikuli, je me suis retrouvé avec une boucle de récursion Calculator.sikuli dans le programme qui faisait un nombre incalculable de répertoires "calculator.sikuli.calculator.sikuli". Je pourrais déplacer l'arbre, mais le chemin d'accès est trop long à supprimer.

Après avoir essayé plusieurs solutions avec la boucle popd, Scandisk et obtenir (de manière perceptible) nulle part ....

J'ai écrit ce script pour « aller en profondeur » dans les dirs récursifs (dans un répertoire appelé « a »), les déplacer (à un répertoire appelé « b »), puis supprimez l'arbre tronqué, les retourner (à « 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-répertoires récursifs à l'infini
  • REM suggère d'arrêter d'abord le service de recherche Windows (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 pour exécuter le fichier de commandes à nouveau.


4
2017-08-09 09:12



J'ai passé des heures à regarder ça. Ce fichier .bat est comme un cadeau du ciel. Vous, silo, êtes un ange. xd - Squish


Nous avons eu un problème comme celui-ci au travail quand éclipse a décidé de créer des déchets sur les disques durs. Nous avons corrigé cela en utilisant la fonction robocopy / MIR pour mettre en miroir un répertoire vide dans le répertoire imbriqué.


2
2018-03-11 06:25