Pregunta Cómo eliminar directorios con ruta / nombres demasiado largos para la eliminación normal


Windows parece tener un límite de longitud en los nombres de los archivos al intentar eliminar, aunque no evitará que esos archivos se creen.

Nuestro proceso de compilación crea una cantidad de archivos temporales (muchos compilados a partir de WSDL) que entran en conflicto con este límite. Nuestra secuencia de comandos ant es de alguna manera capaz de eliminarlos al hacer una limpieza, pero a veces tengo que eliminar el directorio workarea (donde van todos los archivos temporales) sin hacer una limpieza completa de hormiga.

Este es el mismo error esta pregunta, pero las respuestas allí realmente no me funcionan ya que estoy tratando con un directorio, no un archivo, y no siempre sé qué archivos o subdirectorios específicos están causando el problema. Y trato de evitar cualquier proceso manual (aparte de activar un solo comando) para eliminarlos realmente.

Si trato de eliminar el directorio de Explorer obtengo el error

Cannot delete [file name]: The file name you specified is not valid or too long.  
Specify a different file name

Molesto Remove-Item en powershell da el siguiente error:

Remove-Item : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
At line:1 char:12
+ Remove-Item  <<<< -force -Recurse <directory>

¿Alguien sabe de alguna herramienta o forma fácil de evitar este error de eliminación sin tener que encontrar manualmente los archivos problemáticos y moverlos / cambiarles el nombre?


349


origen


Encontré la solución justo antes de publicar esta pregunta, pero como otros pueden toparse con esto, decidí publicarlo para que pudieran encontrar la solución que encontré. - Herms
Oh, lo sé, pero generalmente cuando hago cosas como esta, dejo la pregunta "sin respuesta" por un tiempo para ver si alguien más tiene una mejor solución. - Herms
Por Lejos la solución más simple: youtube.com/watch?v=qQTyTprFAOg - TaW
utilizando Ubuntu o cualquier otro Linux Bootable CD podemos arrancar nuestra computadora para Ubuntu o cualquier otro sistema operativo para temporal. Luego, podemos seleccionar la carpeta y podemos eliminarla fácilmente. - kelum priyadarshane
Esta pregunta más antigua también tiene algunas respuestas interesantes: superuser.com/questions/45697/... - AdamV


Respuestas:


Utilizar el 7-Zip Administrador de archivos para eliminarlos. Utilizar CambioDEL insinde el Administrador de archivos 7zip (de lo contrario, Windows intenta moverse a la Papelera de reciclaje, que volverá a fallar).


392



Gracias - esto eliminó un árbol de directorios que fue un poco recursivo y demasiado profundo para eliminar del / rmdir / rm / explorer - Martin Beckett
Funcionó de maravilla utilizando shift + Del - 7zip no pudo enviar archivos de larga duración a la papelera de reciclaje .... - cori
+1 7zip. Tienes que navegar a la carpeta, y luego usar shift + Del como dijo @cori. Si selecciona el Delete opción desde el menú contextual, fallará allí. shift + Del ¡eso! - Urda
7zip no funcionó para win7 64, por lo que lo hizo linux. - Erik Friesen
He votado a favor de esto porque con 7zip puedes eliminar también eliminar una carpeta que contenga largas carpetas anidadas dentro. Tenía mi problema con una carpeta node_module que contenía toneladas de basura de la carpeta anidada y no pude eliminarla. 7zip corregido desde la carpeta base sin problemas. +1 - Gruber


Ninguna de las otras respuestas (gratuitas) aquí funcionó para mí, pero encontré una en otro sitio:

rimraf <dir>

rimraf es un Node.js paquete, por lo que deberá instalar Node.js, que incluye npm. Entonces puedes ejecutar:

npm install -g rimraf

Entonces puedes correr rimraf desde la linea de comando

Encontré esta solución porque npm estaba causando este problema debido a la forma en que anida las dependencias.

Por cierto, rimraf obtiene su nombre del comando UNIX rm -rf, que elimina de forma recursiva archivos y carpetas.


307



Intenté muchas maneras. Esto solo funciona perfectamente! - Duckegg
La mejor respuesta de todas :) sí, es fácil y fácil - Al-Mothafar
Esta debería ser la respuesta aceptada. - NINCOMPOOP
Su solución funciona, pero esto es tan f ## k-up que tengo que usar un módulo js del nodo para eliminar las carpetas de los módulos del nodo js ... No quiero vivir en este planeta nunca más - Benoit P
Para empezar, Node creó el problema, así que ... interesante ... que también tienen una solución. - Eric J.


Ahi esta no es necesario instalar ningún programa para resolver este problema

Este problema se soluciona fácilmente usando robocopy, preinstalado desde Windows Vista, lanzado en 2006.

Por ejemplo, rmdir /S /Q <dir> ha sido reportado como fallido en algunos casos. No es necesario usar 7zip o cualquier otra herramienta de terceros. Powershell es una exageración. Cygwin puede funcionar, pero es posible que no lo tenga instalado. Entonces, centrémonos en robocopy

La idea es

  1. utilizar robocopy para copiar + actualizado
  2. desde un nueva carpeta vacía 
  3. a la carpeta que desea eliminar, el objetivo.

Después de ejecutar robocopy, el directorio de destino también estaría vacío.

Estas instrucciones son para la línea de comando. Simplemente abra la búsqueda en Windows, escriba cmd y presiona Enter.

Digamos que la carpeta que queremos eliminar, el objetivo, es

C:\delete\this folder\with a very long name 

  1. Primero crea un directorio vacío, f.i. C:\emptyfolder.

    mkdir C: \ emptyfolder

  2. Copie + actualice desde el directorio vacío al destino, usando la opción "/ purgar"

    robocopy c: \ emptyfolder "C: \ delete \ this folder \ con un nombre muy largo" / purga

  3. Eliminar el directorio vacío Ya no lo necesitas más

    rmdir c: \ emptyfolder

Como no hay archivos o carpetas en el directorio de origen (C:\emptyfolder), simplemente elimina los archivos y carpetas en el directorio de destino (C:\delete\this folder\with a very long name) ¡recursivamente!

  • Truco final: puedes evitar escribir a mano

    C: \ eliminar \ esta carpeta \ con un nombre muy largo

    Al arrastrar la carpeta desde una ventana del Explorador y colocarla en la ventana Terminal / cmd.

Ten cuidado: Los archivos eliminados no irá a la basura ¡carpeta! Una vez eliminados, los archivos no se pueden recuperar.

(Tomado de "¿Ruta de acceso demasiado larga? Usa Robocopy" de BVLANGEN)

PD: me doy cuenta de que esta respuesta estuvo aquí, menos didácticamente. ¿Cómo eliminar un archivo en Windows con un nombre de archivo demasiado largo? [duplicar]

Benoit adicional:

Es posible que deba realizar este proceso más de una vez para deshacerse de todos los archivos.


117



¡Gracias, buen señor! Esta debería ser la respuesta aceptada como todas las demás no funcionó o se requiere una Herramienta de terceros. :) - MickyD
Esto funciona perfectamente ... no es necesario instalar nada (hasta donde yo sé) y es rápido. ¡Esta debería ser la respuesta aceptada! - ksumarine
Esto mantiene algunos (o todos) del árbol de directorios en "c: \ deletefolder" (dir de destino). De todos modos, borré todo en un abrir y cerrar de ojos para mí (supongo que los archivos eran pequeños) y tuve que manualmente <Del> "c: \ deletefolder", los directorios secundarios se eliminaron sin problemas. Trabajado como un encanto. +1, debería ser la respuesta aceptada! :) - rld.
@rld, pero ¿existía "deletefolder" antes? De lo contrario, creo que debería estar vacío si fuera un directorio nuevo. De lo contrario, es un desastre. Podría agregar un último paso para "rmdir deletefolder". - hectorpal
@hectorpal 1. Tuve un árbol con restos de una copia de seguridad de la unidad de Windows C de otra máquina, que logré eliminar a excepción de las partes muy largas, es decir. "% USERPROFILE% / foo / very_long_dirname / vldn2 / vldn3 /(...)/ very_long_filename". 2. cd ~; mkdir empty; robocopy empty foo /purge3. Me quedé con ~ / foo / maybe_something_deeper_too_cant_remember / y realmente no me tomé el tiempo de investigar más porque ya estaba enojado con M $ por faltarme el respeto y perder el tiempo, pero eliminé una simple <Delete> on ~ / foo in explorer con éxito, después de fallar interminablemente (incluso con la propiedad) hasta robocopy. - rld.


Creo que he encontrado una manera de borrar cosas de cmd. Originalmente probé la del comando, pero eso no funcionó. Entonces recordé rmdir. Haciendo lo siguiente:

rmdir /S /Q <dir>

parece haber funcionado


78



No funcionó para mí :( - Andrew Arnott
recuerde caer en cmd antes de intentar ejecutar rmdir. - brianpeiris
Para aquellos que no pueden usar esta solución, tengo una solución alternativa que funcionó para mí (con nombres de ruta / archivo demasiado largos): mueva el / los archivo / directorios a C: \ para acortar la ruta y luego eliminar desde allí. - Anders Sandberg Nordbø
Es posible tener directorios para los que no funcionará esta solución, que 7-Zip puede eliminar. Acabo de pasarme esto a mí. - SamStephens
Esta solución es obtener resultados inconsistentes. Por favor, no lo votes. - hectorpal


La herramienta que utilicé cuando tuve este problema fue FastCopy. Yo seleccioné Eliminar todos del menú desplegable, seleccioné el directorio que quería eliminar e hice clic Eliminar todos.

FastCopy delete dialog screenshot

FastCopy es portátil (no requiere instalación), y hay versiones de 32 bits y 64 bits disponibles.


29



Si está buscando una herramienta de línea de comandos, podría usar una pequeña herramienta que he publicado en GitHub (github.com/epsitec/Tools-RecursiveDelete) - Pierre Arnaud
Tenía un conjunto de archivos / carpetas anidados de forma recursiva. Esta fue la única solución trabajando - Pierluigi
Esto funcionó para mí cuando, las cosas de la línea de comando fallaron, el intento de 7zip falló. ¡e incluso el soporte de Microsoft estaba perplejo! - Kit Ramos
Lo mismo aquí - Empecé a borrar archivos con 7zip, pero también actuó muy raro y tuve que Shift + Delere cada directorio varias veces seguidas para realmente eliminarlo, pero luego probé esta herramienta, y funcionó como un hechizo . Se lanzó dos veces para deshacerse de todos los archivos. ¡Gracias! - Artanis
Gracias, también para mí, la única solución de trabajo, EXCELENTE !!!! - tim


Cygwin's rm -rf funciona bien en largos caminos!


24



¡Cygwin trabajó para mí perfectamente! Acabo de hacer una -rm -rf y todos los archivos se eliminaron. - Ranhiru Cooray
Funcionó para mí también en GNU bash, versión 4.1.10 (4) -release - rjzii
Funcionó muy bien cuando se ejecuta desde una ventana de comandos de Git Bash. Había instalado GitGui para eso. - Albo Best


Sin instalar software adicional, puede usar subst comando para crear temporalmente un alias a un largo directorio nombrado.

p.ej. Si quieres borrar la carpeta C:\Very long directory\that exceed\length limit\blah blah blah\abcde\folder to be deleted puedes usar el comando

subst x: "C:\Very long directory\that exceed\length limit\blah blah blah\abcde"

y luego puedes borrar X:\folder to be deleted en el Explorador de Windows o en el símbolo del sistema fácilmente. Para eliminar el alias de la letra de unidad temporal, use el comando

subst x: /d

22



Probé todas las demás respuestas (incluidas las respuestas de otras preguntas similares) y esta fue la única que terminó trabajando para mí. Y fue, con mucho, el más rápido. - glenneroo
Esta es, de lejos, la mejor respuesta: funciones simples e integradas, sin problemas con el registro. Debería ser la respuesta aceptada. - Kevin Roche
Fácilmente el método más limpio y directo, gracias Kenneth. - Seth


Simplemente pasa de Powershell al comando ejecutando a continuación:

Cmd /C "rmdir /S /Q <dir>" 

21



"El directorio no está vacío". Oops. El OP quiere eliminar una carpeta no vacía. - leye0


La solución de Dentrasi es lo que funcionó mejor para mí, pero quería publicar los pasos específicos en una respuesta de alto nivel.

  1. Descargue e instale la última versión estable de 7zip.
  2. Ejecute el Administrador de archivos 7zip (7zfm.exe)
  3. En 7zip File Manager, navegue para que pueda ver el nombre de la carpeta que desea eliminar (es decir, está en la carpeta principal).
  4. Mantenga presionado el botón Shift.
  5. Haga clic en el "Borrar", ya sea en su teclado o en la barra de herramientas del Administrador de archivos 7zip; asegúrate de que aún mantienes presionada la tecla Shift.
  6. Haga clic en el "DE ACUERDO"botón; asegúrate de que aún mantienes presionada la tecla Shift.

17



Buen intento, pero todavía no funcionó para mí con 10 k de carpetas recursivas. Solo el rimraf funcionó. - Julian Knight
@JulianKnight: Sí, este enfoque no terminó de funcionar para mí el 100% del tiempo, tampoco. Solo quería mencionarlo porque era uno de los procesos más sencillos, y al menos funcionaba parte del tiempo. Lo único que he encontrado que ha funcionado el 100% del tiempo es el enfoque del script del módulo Powershell + NTFSSecurity, que describí a continuación. IIRC rimraf falló cuando se le llamó, que es la forma en que me metí en este lío, en primer lugar. Mira este hilo de Node.js para más detalles: github.com/nodejs/node-v0.x-archive/issues/... - Mass Dot Net
Sí, siempre habrá problemas como ese. De hecho, fue el código de instalación de la biblioteca IDE de Arduino lo que me hizo en (Java), accidentalmente seleccioné la carpeta que contenía las bibliotecas como una carpeta para instalar y quitar una biblioteca. Maté el proceso tan pronto como me di cuenta, pero ya tenía 10 de k de carpetas (¡maldito i7 / SSD!) El siguiente lanzamiento principal de NPM está destinado a ayudar a resolver muchos de los problemas de instalación profunda de la biblioteca para Node, ya que las dependencias deben cumplirse una estructura mucho más plana. Todavía estoy muy contento de que alguien me haya puesto a rimraf, fácil y gratis. - Julian Knight
@JulianKnight - Sí, hace uno o dos días alguien me dijo que npm3 debería ayudar a aliviar estos problemas al evitar estructuras de carpetas de dependencia profundamente anidadas. - Mass Dot Net
No sé si "previene", pero trata las dependencias anidadas de manera más sensata, de modo que si su aplicación principal necesita la biblioteca X v1.0 y la biblioteca Y requiere Z, que también requiere X v1.0, se utilizará la biblioteca de nivel superior. Actualmente Z instalaría su propia versión de X. - Julian Knight


Hay dos cosas que no se mencionan en las respuestas existentes.

  1. Puede usar el prefijo de ruta de longitud extendida para acceder a rutas largas
  2. Con Windows 10, puede habilitar el soporte de ruta larga para uso general; tenga en cuenta que no todas las aplicaciones funcionarán con rutas largas, debe probar el software anterior. Solo el software con una entrada de manifiesto adecuada podrá hacer uso de esto.

Prefijo de ruta larga

La API de Windows tiene una función especial que admite nombres de ruta Unicode de hasta 32k caracteres de longitud (cada elemento tiene hasta 255 caracteres de longitud).

Esto a menudo se denomina erróneamente denominación UNC, pero no está relacionado.

El prefijo utilizado para indicarle a la API que use rutas largas Unicode es \\?\ como en:

\\?\D:\very long path

Los nombres UNC normalmente se usan cuando se hace referencia a rutas en servidores remotos en la forma \\servername\path name\file name. Puede combinar esto con el prefijo de ruta larga así: \\?\UNC\server\share

Tenga en cuenta que algunas aplicaciones mal escritas, pero tristemente bastante comunes, no admiten rutas de archivos UNC ni el prefijo de ruta larga.

Referencia: https://msdn.microsoft.com/en-gb/library/windows/desktop/aa365247(v=vs.85).aspx#maxpath

Soporte de larga trayectoria

Esta es una opción que se ha agregado a las versiones recientes de Windows 10. No está, en el momento de la escritura, activada de manera predeterminada ya que requiere soporte específico de la aplicación. Curiosamente, PowerShell tiene soporte integrado, por lo que habilitar esta opción permitirá el uso de rutas largas directamente en las secuencias de comandos de PowerShell.

Puede activarlo a través del editor de políticas de grupo si tiene una versión de Windows con eso. O simplemente puede usar el siguiente cambio de Registro. Como siempre, haga una copia de seguridad de la sección del registro que está cambiando antes de hacer nada.

  1. correr regedit.exe.
  2. Confirme el aviso de UAC.
  3. Navega a la tecla: HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy Objects\{48981759-12F2-42A6-A048-028B3973495F}Machine\System\CurrentControlSet\Policies
  4. Crea o cambia la clave LongPathsEnabled.
  5. Si no existe, haga clic derecho en Políticas y seleccione Nuevo> Valor Dword (32 bits) en el menú.
  6. Conjunto LongPathsEnabled a 1 para permitir.

Todas las aplicaciones con entradas de manifiesto apropiadas ahora tendrán acceso a las rutas largas estándar POSIX. Esto debería incluir aplicaciones de Windows Store.

Referencia: https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/

ACTUALIZACIÓN 2017-04-09

@maoizm señaló un problema con la clave de registro anterior, así que lo hice un poco más de excavación. Parece que ahora puede establecer el soporte de nombre de archivo largo con una clave de sistema:

HKLM\SYSTEM\CurrentControlSet\Control\FileSystem LongPathsEnabled (Type: REG_DWORD)

Esto todavía solo funciona para las aplicaciones que están específicamente configuradas para usarlo (requiere una entrada en manifest.xml de la aplicación).

También debe tener en cuenta que no puede usar nombres de ruta relativos con este método.


10



{48981759-12F2-42A6-A048-028B3973495F}Machine parte de la ruta de registro será diferente en cada computadora; puede que no sea obvio para todos - maoizm
@maoizm - buen punto, gracias por destacar eso. Por favor vea mi actualización para una alternativa si usa la actualización del aniversario W10 o posterior. - Julian Knight
Estoy escribiendo una biblioteca llamada FoundationIO, y estoy tratando de hacer que la ruta larga sea la predeterminada, ¿hay alguna función a la que pueda llamar o macro que pueda establecer para que el soporte de larga ruta se habilite automáticamente para cualquier usuario de mi biblioteca? - MarcusJ
Hola Marcus, ¿es esta una biblioteca nativa de Windows? Si es así, .NET tiene el soporte requerido ya presente como parte de la API de Windows relevante. Lamento no saber los detalles ya que no soy un programador de .NET o Win API, pero los detalles deberían poder buscarse en MSDN. - Julian Knight


Me gusta la solución de cmd. Aunque quiero compartir otra solución que incluso funciona en solo Explorer: intente acortar los nombres de las carpetas principales antes de la eliminación: los nombres más cortos acortarán la ruta. Diga, usted tiene esta estructura de árbol de la carpeta:

DO:\

.. Proyectos

... Un proyecto increíble durante la primavera de 2014

.. Algunos actividad en el parque en la ciudad un viernes

... bla bla bla bla bla bla bla bla bla bla bla bla bla

.. .. .. .. .. Archivos reales con nombres largos, también

En este caso, no puede eliminar las carpetas, tampoco puede eliminar ni cambiar el nombre de los archivos. Si desea eliminar toda la estructura de la carpeta o parte de ella, puede cambiar temporalmente el nombre de las carpetas principales y acortar la ruta, y luego eliminar la carpeta. Los nombres pueden ser solo letras:

DO:\

.. Proyectos

.. .. X

.. .. .. y

.. .. .. .. z

.. .. .. .. .. Archivos reales con nombres largos, también

En mi caso, solo quería eliminar toda la carpeta con muchas subcarpetas y archivos. Entonces no me importaron los nombres de las carpetas.


8



He escrito una pequeña herramienta que hace justamente eso y lo sube a GitHub. github.com/epsitec/Tools-RecursiveDelete - Pierre Arnaud
Todos los comandos o Shift + DEL no funcionan para mí, pero esto sí. - larkee
Realmente no funciona cuando tienes 10's k's de carpetas anidadas - Julian Knight
tampoco funciona si una de las carpetas tiene un nombre realmente largo (no puede cambiar el nombre de la carpeta ofensiva). - aucuparia