¿Cómo elimino una carpeta que está anidada bastante profunda y evito "Nombre de archivo demasiado largo"?

70

Eclipse creó una carpeta temporal en uno de los directorios que está anidada bastante profundo, por ejemplo

dir1\dir1\dir1\dir1\...

No puedo eliminar esta carpeta en Windows a través del Explorador, los comandos delo rmdir, ni el comando 'rm' de Cygwin. ¿Cómo debo eliminar esta carpeta muy larga?

Simplemente sigue diciendo "Nombre de archivo demasiado largo ..."

usuario39186
fuente

Respuestas:

105

Si eres como yo y no te gusta instalar software adicional para solucionar un problema como este, iría con la sugerencia y uso de XQYZrobocopy para resolver el problema. (En mi caso, el problema fue creado por robocopy en primer lugar, copiando un directorio que tenía puntos de unión recursivos sin suministrar / XJ a robocopy).

Para eliminar el árbol de directorios que comienza en c: \ subdir \ more \ offending_dir :

El proceso total paso a paso es tan simple como esto:

  1. cd c:\subdir\more para cd en su directorio padre.
  2. mkdir empty para crear un directorio vacío
  3. robocopy empty offending_dir /mir para reflejar el directorio vacío en el ofensivo.
  4. ¡Después de esperar un poco, has terminado! Termine con:
  5. rmdir offending_dir para deshacerse del directorio ofensivo ahora vacío y
  6. rmdir empty para deshacerse de su directorio vacío intermedio.
jofafrazze
fuente
2
Excelente sugerencia. Mi problema también fue creado por robocopy, y como usted describió, la solución robocopy funcionó para mí.
Nathan Garabedian
3
También hice un lío con robocopyy puntos de unión; ¡Gracias por mostrarme cómo usarlo para limpiar el desorden!
Mr.Wizard
mis carpetas no fueron creadas por robocopy pero las eliminó perfectamente
Sasha
11
El administrador de paquetes de nodo (NPM) me causó este problema. Había tantos paquetes anidados por alguna razón.
David Sherret
esta es claramente la mejor y más razonable respuesta, mucho mejor que un script por lotes recursivo a medida
monastic-panic
39

Esto es realmente bastante simple de arreglar. Digamos que la estructura del directorio es como tal:

C:\Dir1\Dir1\Dir1\Dir1…

Para solucionarlo, simplemente cambie el nombre de cada carpeta a un nombre de carpeta de un carácter hasta que ya no sea demasiado largo para eliminar:

  1. Renombrar C:\Dir1aC:\D
  2. Navegar a C:\D\
  3. Renombrar C:\D\Dir1aC:\D\D
  4. Navegar a C:\D\D\
  5. Pase a 1 hasta que la longitud total del camino sea <260

Aquí hay un archivo por lotes para automatizar el proceso (esta versión simple es mejor para directorios simples como el descrito en la pregunta, especialmente para los desechables). Páselo a la carpeta más alta posible (por ejemplo, C:\Dir1para C:\Dir1\Dir1\Dir1…o C:\Users\Bob\Desktop\New Folderpara 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

Explicación técnica

Las otras soluciones propuestas son al revés; no puede solucionarlo trabajando desde el directorio más interno hacia afuera, debe ir en la otra dirección.

Cuando intenta acceder a un directorio, lo hace utilizando su ruta absoluta, ya sea explícitamente o no, que incluye todo lo que vino antes. Por lo tanto, para una estructura de directorio como C:\Dir1\Dir1\Dir1\Dir1, la longitud de la ruta al más interno Dir1es 22. Sin embargo, la longitud de la ruta al más externo Dir1es solo 7 y, por lo tanto, aún es accesible independientemente de su contenido (en el contexto de la ruta de un directorio dado , el sistema de archivos no tiene conocimiento de lo que contiene o el efecto que tiene sobre la longitud total de la ruta de sus directorios secundarios; solo sus directorios antecesores; no puede cambiar el nombre de un directorio si la longitud total de la ruta será demasiado larga).

Por lo tanto, cuando encuentre un camino que es demasiado largo, lo que debe hacer es ir al nivel más alto posible y cambiarle el nombre a un nombre de un carácter y repetirlo para cada nivel. Cada vez que lo hace, la longitud total de la ruta se acorta por la diferencia entre el nombre antiguo y el nuevo.

Lo contrario también es cierto. No puede crear una ruta que sea mayor que la longitud máxima admitida (en DOS y Windows, MAX_PATH = 260). Sin embargo, puede cambiar el nombre de los directorios, trabajando desde lo más interno hacia afuera, a un nombre más largo. El resultado es que las carpetas más profundas cuya ruta absoluta es> 260 serán inaccesibles. (Eso no los hace "ocultos" o seguros, ya que son lo suficientemente simples como para llegar a ellos, así que no use este método para ocultar archivos).


Nota al margen interesante

Si crea carpetas en el Explorador de Windows 7, puede parecer que el Explorador le permite crear subdirectorios de modo que la longitud total sea más larga que MAX_PATH, y en realidad lo es, sin embargo, en realidad está haciendo trampa usando "nombres de archivo DOS 8.3". Puede ver esto creando un árbol como el siguiente:

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

Tiene 696 caracteres de largo, que por supuesto es mucho más largo que 260. Además, si navega al subdirectorio más interno en Explorer, lo muestra como se espera en la barra de direcciones cuando no está enfocado, pero cuando hace clic en la dirección barra, cambia la ruta a C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\, que tiene solo 102 caracteres de longitud.

En XP, no hace esto, sino que se niega firmemente a crear una ruta más larga de lo que es compatible.

Lo que sería realmente interesante es descubrir cómo el Explorador de Windows 7 maneja "rutas demasiado largas" cuando NtfsDisable8dot3NameCreationse establece la opción.

Synetech
fuente
3
Que es posible crear un camino más largo que MAX_PATH, como se explica aquí . Desafortunadamente, \\?` doesn't work with rmdir`.
Grawity
@grawity, sí, pero eso se debe a que funciona bajo el mismo principio: un camino corto se renombra a uno más largo; eso solo lo hace dinámicamente al expandir una variable en lugar de cambiarle el nombre manualmente a uno más grande. No es posible crear un directorio cuya ruta absoluta sea demasiado larga cuando el comando de creación tiene suficiente información para determinar la longitud total.
Synetech
3
@Synetech: No, funciona de manera diferente. Las rutas como \\?\C:\dir\dir\dir\dirliteralmente omiten MAX_PATH; no hay "variables" involucradas. (Pero como dije, no funciona con rmdiru otros cmd.execomponentes integrados por alguna razón)
Grawity
por ejemplo, intente ejecutar md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 No funcionará porque el sistema de archivos tiene suficiente información para determinar que la longitud total de la ruta sería de 263 caracteres, por lo que falla.
Synetech
2
(Además, no confunda la longitud de la ruta con la longitud del componente . No puede tener un solo directorio con un nombre de más de 255 caracteres; sin embargo, puede tener una ruta mucho más larga que eso.)
Grawity
17

Puede acortar la ruta utilizando substpara crear una unidad virtual:

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

Cambie a la unidad virtual:

cd Z:

Ahora puedes eliminar los archivos:

del *.*

Retire la unidad virtual:

cd C:\TEMP
subst Z: /d

Eliminar el directorio:

rd /s dir1
Matthew Simoneau
fuente
No; ese primer comando no funcionará si el directorio es demasiado largo; devolverá el error Parámetro no válido .
Synetech
2
@Synetech, claro, pero si sustituye solo C:\TEMP\dir1\dir1\dir1, acortará parte de él, lo que le permitirá ingresar. Es como su sugerencia de cambio de nombre, pero con mapeo en su lugar. ;)
Bobson el
@Bobson, está bien, tienes razón; +1 para los dos. :-)
Synetech
10

Escribí una pequeña aplicación C # para ayudarme a eliminar una estructura muy profunda similar generada por un uso descuidado de Robocopy y una copia de seguridad de Homeserver; de forma predeterminada, Robocopy trata los puntos de unión como carpetas normales ... :-( Podría terminar con un gran desorden sin darse cuenta.

La herramienta está disponible en CodePlex con archivos fuente, para que cualquiera pueda usarla.

http://deepremove.codeplex.com

JPJofre
fuente
¡¡¡TRABAJOS!!! ¡Esta respuesta debe estar marcada como funcionando! El software funciona como mantequilla ... ¡resolvió mi problema en pocos segundos! ¡Gracias!
Rafique Mohammed
7

Hace algún tiempo creé un pequeño ejecutable de utilidad autónomo llamado DeleteFiles que puede usar para realizar esta tarea fácilmente.

Usando esta utilidad autónoma, simplemente puede hacer:

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

para eliminar toda la estructura de carpetas. -r recursivamente la jerarquía de carpetas del directorio de empezar a bajar, -f elimina todas las carpetas que están vacíos (que serán todos ellos si se utiliza . como la especificación de archivo). DeleteFiles admite rutas más largas que el límite MAX_PATH de Windows, por lo que funcionará bien en carpetas profundamente anidadas.

DeleteFiles es gratuito y de código abierto y puede obtener el código binario o fuente de GitHub o instalarlo directamente usando Chocolatey

Rick Strahl
fuente
Gracias, herramienta increíble, ++ por ponerlo en chocolate;) ¡Hace que sea fácil de integrar en una herramienta de CI!
Charles Ouellet
1
Esto hizo el truco. Si tiene un camino realmente largo, agregar > NULal final puede hacer que el proceso sea más rápido.
ryscl
La solución robocopy no funcionó para mí y tampoco la solución de Synetech. DeleteFiles funcionó para mí, pero por alguna razón tuve que ejecutarlo tres veces para eliminar todas las subcarpetas. En cualquier caso, esto resolvió mi problema.
Frank
Re: ejecutando DeleteFiles 3 veces. También lo he visto: creo que se debe a algunas peculiaridades de Windows que bloquean carpetas con archivos en ellas por un corto tiempo, incluso una vez que se han eliminado los archivos. Los pases múltiples detectan la falla ocasional de este problema en subcarpetas, potencialmente anidadas múltiples. Veo el mismo comportamiento con las eliminaciones de Explorer de árboles profundos.
Rick Strahl
5

Simple y fácil ahora

Estaba enfrentando este mismo problema desde hace tanto tiempo con node_modules que carpetas muy anidadas. así que finalmente hice un script para arreglar lo que puede eliminar carpetas acortando las rutas.

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

npm install fdel -g

fdel ./node_modules
dev.meghraj
fuente
No sé por qué los diseñadores decidieron incluir cada dependencia en una estructura cuando podrían haberlo hecho con una estructura plana. Así que este script fue la forma más fácil para mí, ya que estoy usando node.js
user2610529
4

Mientras trabajaba con Sikuli, recibí un bucle de recursión Calculator.sikuli en el programa que hizo una cantidad incontable de directorios "calculator.sikuli.calculator.sikuli". Podría mover el árbol, pero el nombre de ruta es demasiado largo para eliminarlo.

Después de probar varias soluciones con bucle popd, Scandisk y llegar (perceptiblemente) a ninguna parte ...

Escribí este script para 'profundizar' en los directorios recurrentes (en un directorio llamado 'a'), moverlos (a un directorio llamado 'b'), luego eliminar el árbol truncado, moverlos de regreso (a 'a') , y repetir:

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 Se usa para eliminar subcarpetas infinitamente recursivas
  • REM sugiere detener primero el servicio de búsqueda de 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

Esto es solo una llamada para ejecutar el archivo por lotes nuevamente.

SiloSix
fuente
He pasado horas investigando esto. Este archivo .bat es como un regalo del cielo. Tú, silo, eres un ángel. xD
Squish
2

Tuvimos un problema como este en el trabajo cuando eclipse decidió crear basura en los discos duros. Lo arreglamos usando la función / MIR de robocopy para reflejar un directorio vacío en el anidado.

XQYZ
fuente
1

Intentaría abrir un símbolo del sistema y ejecutar:

rmdir /s <directory>

Si eso no funciona, me quedaría en el árbol de directorios y trataría de eliminar un subconjunto de directorios, digamos los 20 directorios más internos, y luego saldría de allí.

Jesse S.
fuente
1
Intenté su sugerencia anterior y todavía dice "El directorio no está vacío" cuando ejecuto el comando anterior a varios niveles de profundidad
usuario 39186
1
Eso es porque este método es al revés. ;-)
Synetech
1

Si se trata de una carpeta de red, simplemente comparta el directorio principal de ese directorio y asígnelo a una unidad en su máquina local y luego elimine su carpeta.

Punnakadu
fuente
21966 [main] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: *** error grave - error interno al leer el entorno de Windows - ¿demasiadas variables de entorno?
user39186
He intentado mover aa subcarpeta anidada 20 niveles de profundidad y puso el error anterior
user39186
1

Abra un símbolo del sistema.

Navegue a la carpeta / directorio que contiene el 'dir1' más alto (asumiremos C: \)

c:\> RD /s dir1

Editar (después de agregar comentarios) :

Otras ideas:

MS ofrece información sobre cómo lidiar con el problema (muchas ideas para probar) aquí .

También existe esta herramienta (nunca la usé personalmente): TooLongPath .

¿Quizás escribir algo (ya que tiene Eclipse) que navega por completo y luego retrocede un nivel de carpeta a la vez, borrando a medida que avanza?

Ƭᴇcʜιᴇ007
fuente
1
Recibo los siguientes 3 errores al usar el comando anterior. El directorio no está vacío. El sistema no puede encontrar la ruta especificada. El nombre del archivo es demasiado largo
User39186
Intenté atravesar decir 'n' niveles profundos e intenté usar el mismo comando, pero no parece ayudar
usuario39186
¡Esto funcionó para mí en win7! gracias
leoh
1

Otra solución: descarga Total Commander. Es un programa muy útil, no solo porque tiene un nombre de archivo largo.

La versión no registrada es nagware pero completamente funcional, hará el trabajo.

Loren Pechtel
fuente
1

Esto se puede hacer directamente desde la línea de comandos o en un archivo por lotes construyendo una ruta UNC al directorio que desea eliminar

así que en lugar de

rmdir /s/q c:\mydirectory

utilizar

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

Las rutas de estilo UNC como esta pueden ser mucho más largas y evitar el límite de 260 caracteres.

Steve Cooper
fuente
No funciona 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 de 64 bits.
Victor
No funciona para Windows 10. Todavía es demasiado largo.
BananaAcid
¡La versión `\\?` Funcionó para mí en Windows 10!
Peter
0

Cuando tengo este problema, simplemente cambio el nombre de algunos de los nombres de carpetas mucho más cortos, luego, una vez que la ruta total es lo suficientemente corta, se eliminará OK. No se necesitan herramientas adicionales.

music2myear
fuente
Sí, pero como dije, tienes que trabajar desde afuera hacia adentro, de lo contrario no funcionará.
Synetech
Por supuesto. En general, he encontrado que los nombres de carpetas más largos tienden a ser los primeros (en las carpetas de parches) o los últimos. La mayoría de las veces, solo necesita cambiar uno o dos nombres de carpeta para obtener la longitud correcta.
music2myear
Sí, pero si comienza con el más interno, no funcionará porque el rencomando fallará path too long.
Synetech
1
Sí, los scripts proporcionados anteriormente son un método inteligente y efectivo para manejar este problema automáticamente. Solo me ha sucedido algunas veces, así que simplemente he usado el proceso de cambio de nombre manual. Para hacer eso, simplemente empiezo a renombrar la estructura de la carpeta donde sea que esté en el árbol infractor, y mi experiencia es que los nombres de carpeta más largos aparecen con más frecuencia al principio o al final de la estructura del árbol. Por lo tanto, mi respuesta es válida, aunque probablemente no sea la más fuerte ni la más inteligente aquí. No vale la pena un voto negativo.
music2myear
> Simplemente comienzo a cambiar el nombre de la estructura de la carpeta donde sea que esté en el árbol ofensivo. Bueno, sí, si ya está dentro del árbol, entonces ciertamente puede cambiar el nombre de al menos esa carpeta (deberá ir a su padre) ; También puede cambiar el nombre de una subcarpeta, pero puede ser demasiado larga.
Synetech
0

Tuve el mismo problema, excepto que fue creado por una tarea recursiva de copia de seguridad de Cobian. Resulta que el software gratuito Cobian incluye una aplicación Deleter que puede eliminar fácilmente estas molestas carpetas anidadas súper rápidamente.

Se encuentra debajo del menú de herramientas.

mrshl
fuente
0

Me encontré con el mismo problema con un desorden de carpetas de más de 5000 directorios que algunas aplicaciones Java y escribí un programa que te ayudará a eliminar esta carpeta. El código fuente completo está en este enlace:

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

Eliminó todo después de un tiempo, pero logró hacer el trabajo, espero que ayude a las personas que (como yo) se encuentran con el mismo problema frustrante

Imanol Barba Sabariego
fuente
-3

Su sistema de archivos puede estar dañado. Ejecute chkdsk para ver si repara algo, luego intente eliminar la carpeta.

malabarista
fuente
No, ese no es el problema. El problema es que la longitud total de la ruta es más larga que la admitida ( MAX_PATH=255). Esto puede suceder incluso con un sistema de archivos no dañado.
Synetech
Ejecutar chkdsk en la carpeta me dio el siguiente error. La unidad, la ruta o el nombre del archivo no es válido
usuario 39186