Forzar la eliminación de archivos con un nombre bastante grande

62

Regularmente uso Node.js para administrar las dependencias de los programas que escribo, no es gran cosa. Hoy terminé con una estructura de carpetas como esta:ingrese la descripción de la imagen aquí

Intentando eliminar cualquier archivo se encontró con este error:

Los nombres de los archivos de origen son más grandes de lo que admite el sistema de archivos. Intente trasladarse a una ubicación que tenga un nombre de ruta más corto o cambie el nombre a nombres más cortos antes de intentar esta operación.

Ya estaba en C: \, por lo que no iba a ser mucho más corto.

Seiyria
fuente
¿Tiene alguna idea de cómo su estructura de carpetas se hizo tan grande? Me encontré con la misma situación al instalar Grunt.
eran otzer
1
@eranotzer usando npm.
Seiyria
¿No hice las dependencias en sus paquetes.json donde se escribieron incorrectamente?
eran otzer
@eranotzer Sí. Debido a cómo funcionaba npm @ 2, cada dependencia anidaba sus dependencias dentro de ella. Esto significaba que las cadenas de dependencia podían ser arbitrariamente largas. npm @ 3 está buscando ajustar este comportamiento.
Seiyria

Respuestas:

75

Utiliza la herramienta de Microsoft robocopy.exe.

  1. Crear una nueva carpeta vacía, por ej. c:\empty
  2. Luego copie esa carpeta vacía en la carpeta que contiene los nombres de archivo largos que está tratando de eliminar, por ejemplo c:\myannoyingfolder. Haga esto así en el símbolo del sistema:

    robocopy / MIR c: \ empty c: \ myannoyingfolder

Flo
fuente
Dado que esto es parte de mi flujo de trabajo con bastante frecuencia, descubrí cómo integrarlo con el shell de Windows. Mira mi respuesta a continuación. :)
toddmo
Nota: este comando puede tardar unos segundos o incluso minutos en finalizar. Entonces, no te preocupes y deja que haga la magia :-)
Adil Malik
Gracias, trabajó para mi. Tuve que asegurarme de que también eliminé cualquier proceso (IIS) que todavía estuviera reteniendo uno de los archivos.
Slick Shinobi
Cada vez que intento abrir robocopy.exe, una ventana parpadea por un segundo y luego no sucede nada. Por favor ayuda
Maulik Modi
29

bueno, digamos que quieres eliminar un árbol D:\very\long\path, no necesariamente necesitas usar ninguna herramienta como Robocopy.

  1. Vaya al directorio raíz de la unidad que contiene el directorio que no puede eliminar.
  2. Cree un directorio con un solo nombre de letra, por ej. D:\a
  3. Navegue al interior del directorio que desea eliminar, en este caso D:\very\long\path
  4. Seleccione todo ( Ctrl+ A) y Corte ( Ctrl- X)
  5. Navega a la carpeta que acabas de crear
  6. Pegar ( Ctrl- V)
  7. Ahora, suba al directorio raíz y elimine la carpeta temporal, en este caso D:\a
  8. Luego regrese y elimine el directorio original
gd73
fuente
2
Esto no funcionó para mí en el primer intento. Sin embargo, después de repetir este procedimiento, en algunos niveles de carpeta más pude eliminar todo.
abaldwin99
1
Gran solución, funcionó a la perfección. Simple y efectivo, gracias!
Caner Öncü
¡¡EXCELENTE!! ¡¡¡Funciona de maravilla!!! No se necesitan otras herramientas. ¡Gracias!
Prasanth KC
Esto funciona muy bien, y agregaría un punto a esto, si la selección de archivos de la ruta no funciona, puede seleccionar una carpeta en algún lugar en el medio de la ruta larga y mover esa carpeta a una carpeta temporal y luego eliminar ambos de manera similar.
Narayana Nagireddi
4

Comencé a escribir este problema mientras intentaba una multitud de comandos, incluidos del /Fy rmdir /S(además de mantener presionada la tecla Mayús mientras eliminaba para intentar omitir la papelera de reciclaje). Creo que en rmdir /Srealidad eliminó todos los archivos, así que pude continuar con la eliminación de las carpetas que eran nodos de hoja, y luego progresé hacia el árbol unos pocos nodos a la vez. Finalmente los limpié a todos, pero eso fue ridículo.

Seiyria
fuente
4

Puede integrar esta funcionalidad en el shell de Windows. Mi mejora en la respuesta de Flo fue demasiado larga para un comentario.

Agregué un Deletecomando al menú contextual de Windows.

ingrese la descripción de la imagen aquí

El delete.regarchivo agrega entradas de registro para asociar carpetas con el robodelete.batarchivo por lotes.

delete.reg

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\Delete]

[HKEY_CLASSES_ROOT\Directory\shell\Delete\command]
"Extended"=""
@="\"D:\\Documents\\robodelete.bat\" \"%1\""

robodelete.bat

mkdir c:\empty
robocopy /MIR c:\empty %1
rmdir %1
rmdir c:\empty

Nota : es posible que deba cambiar las rutas en ambos archivos según sus preferencias.

ADVERTENCIA : no hay forma de deshacer este comando. ¡No utiliza la papelera de reciclaje y no le pide a Y / N que confirme antes de destruir la carpeta para siempre!

toddmo
fuente
Gracias por la advertencia. También necesito esto en mi flujo de trabajo, pero me gustaría evitar tener un botón nuclear en mi menú de clic derecho que carece de una confirmación S / N. Si tengo tiempo, intentaré hacer ese ajuste y sugeriré una edición.
abaldwin99
1
@ abaldwin99, como este quizás stackoverflow.com/a/1807318/1045881
toddmo
4

La herramienta de línea de comandos de código abierto SuperDelete ( GitHub ) funcionó para mí después de que otras opciones fallaran (Windows 10).

Joshua Fox
fuente
3

La mejor manera de hacer esto es usar robocopy, lo documenté en mi blog personal para que lo siga:

http://clintboessen.blogspot.com.au/2014/05/how-to-delete-files-which-exceed-255.html

Clint
fuente
44
Si bien este enlace puede responder la pregunta, es mejor incluir aquí las partes esenciales de la respuesta y proporcionar el enlace como referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia o desaparece.
Andrea
0

En muchos casos, el CD en el directorio desde un símbolo del sistema y el uso de DEL funcionarán.

De lo contrario, debe trabajar su nombre ARRIBA en el árbol del directorio: cambie el nombre de la carpeta de nivel más bajo a un nombre más corto (por ejemplo, "a"), luego el siguiente nombre de carpeta más alto, y así sucesivamente, hasta que la ruta total sea lo suficientemente corta. Al trabajar de abajo hacia arriba, siempre manipulas los nombres, que tienen una ruta completa más corta que los archivos finales.

Eugen Rieck
fuente
0
  • Abrir símbolo del sistema administrativo
  • net use z: c:\path
  • del z:\*.*

Ajustar en consecuencia. Z: es solo una letra de unidad arbitraria para mapear la ruta ofensiva. Ese último comando de borrado borrará TODO el directorio que haya asignado, por lo tanto, sea más específico según sea necesario.

Bradley Forney
fuente
2
¡Esto es muy peligroso para usuarios no expertos! Existe la posibilidad de borrar una unidad si se hace mal.
Rudi Strydom
De acuerdo 100%. Definitivamente proceda con precaución en este caso.
Bradley Forney
0

Una buena manera es tener Linux de arranque en pendrive y eliminar archivos sin problemas del sistema operativo de CD en vivo .

Dariusz Filipiak
fuente
-1

También tuve el mismo problema, y ​​lo encontré yo mismo, simplemente cambie el nombre de la carpeta principal lo menos posible. Ex. Si nuestra carpeta en " D " conduce como D: // Folder / Undelete_Folder . Solo una cosa que tiene que hacer es renombrar el nombre de la carpeta principal tan pequeño como, puede renombrarlo como " a ". entonces su ubicación será D: // a / Undelete_folde r. y luego elimine la carpeta principal.

Rohit R
fuente
Esto no solo no necesariamente funciona (¿y si todavía es más grande, incluso con la reducción?), Sino que mencioné explícitamente que mi carpeta estaba en la raíz de la unidad.
Seiyria
-2

Si todo lo demás falla

Vaya al Directorio final en la cadena. Cortar los archivos La pegar nuevamente en el 4to o 5to archivo en la Cadena. Entonces [Shift] + [Delete] debería hacer el truco.

Era escéptico para ejecutar lo anterior en el símbolo del sistema elevado ya que estaba eliminando un archivo de restauración de prueba de una copia de seguridad DPM.

espero que esto ayude.

Andre
fuente
Esto probablemente no funcionará porque todavía tendrán esa ruta de archivo larga para la operación de corte.
Seiyria