Eliminar completamente una carpeta en Windows usando la línea de comando

57

Necesito eliminar una carpeta que contiene otras carpetas y archivos dentro. Intenté dely los rmdircomandos pero a veces fallan con algunas líneas de error:[PATH]: The directory isn't empty.

¿Hay alguna buena alternativa?

Francesco Zanini
fuente
He experimentado inconsistencia en si rmdir con las banderas apropiadas elimina todo en un árbol de directorios (y / o el árbol en sí), y la única explicación posible que tengo es lo que dice Harry Johnston.
r_alex_hall

Respuestas:

15

Esto me sucede mucho con mis scripts de compilación automatizados.

Supongo que la razón podría ser alguna aplicación que tiene un archivo abierto en ese directorio con "share delete". Es decir, la aplicación permite la eliminación del archivo (por lo que creo que la llamada DeleteFile no falla), pero el archivo solo desaparecerá después de que dicha aplicación haya cerrado su identificador.

Eso significa que el archivo aún puede estar allí cuando el rmdircomando intenta eliminar la carpeta, de ahí el mensaje de error. Poco después, dicha aplicación cerrará su identificador, el archivo desaparecerá y, cuando inspeccione la carpeta para ver qué archivo rmdirestaba hablando, estará vacío.

Al menos esa es mi teoría.

La solución propuesta por Harry Johnston se ve bien. Solo insertaría una pausa entre los rmdircomandos. Por supuesto, Windows no tiene un comando de "pausa" fácilmente programable (corrección: las versiones antiguas de Windows no lo tienen, las más nuevas tienen - vea los comentarios). Pero si la granularidad de segundos es suficiente, se puede usar pingpara crear una pausa:

ping -n {desired_delay_in_seconds + 1} 127.0.0.1 >nul

Entonces en total:

rd /s /q foo
:: retry once
if exist foo (
    :: clear errorlevel
    cmd /c
    :: pause
    ping -n 2 127.0.0.1 >nul
    :: retry
    rd /s /q foo
)
:: retry yet again
if exist foo (
    cmd /c
    ping -n 2 127.0.0.1 >nul
    rd /s /q foo
)
:: give up
if exist foo {panic}
Paul Groke
fuente
En mi experiencia, una pausa nunca es necesaria, pero YMMV. (Por supuesto, si realmente hay otra aplicación en juego, es preferible identificarla y esperar explícitamente a que salga si es posible.)
Harry Johnston
Bueno ... implementé un bucle de reintento 10x con un segundo retraso por reintento. Funciona ahora. No voy a tratar de eliminar la pausa, solo para ver que falla nuevamente :-) Por supuesto, eso no significa que sea necesario. Solo siendo muy cauteloso.
Paul Groke
2
OT: Por eso odio las ventanas. Todo es muy dificil. rm -rf /directory/debe ser global en todos los sistemas operativos.
2
En realidad hay una especie de comando de "pausa"; para pausar tres segundos puede usar esto:timeout /t 3
r_alex_hall
@r_alex_hall De hecho (pero de forma nativa solo desde Vista en adelante, XP y versiones anteriores no tienen el pausecomando).
misha256
57

Tratar:

rmdir /S your_directory

o:

rmdir /S /Q your_directory 

para saltear los mensajes de confirmación.

AndrewQ
fuente
1
Ya probé estas opciones, pero mientras escribía dely rmdirno preguntaba nada, solo enviaban algunas líneas como la de la descripción.
Francesco Zanini
2
rmdir /seliminará todo lo que sea posible eliminar. Es posible que tenga archivos bloqueados por un programa, archivos de solo lectura o archivos que necesita acceso administrativo para eliminar. No hay un solo comando que se encargue de todas esas situaciones por usted
nvuono
Si aún recibe mensajes de error, intente con PowerShell: el cmdlet Remove-Item es un poco más poderoso que rmdir.
AndrewQ
1
rmdir / S <directory> está eliminando el directorio y subfolers y directorios. También pregunta ¿Estás seguro? En Windows 10. Gracias
Jasmeet
1
@r_alex_hall RMDIR / s borra archivos en directorios. Pero DEL / s eliminará solo los archivos y conservará los directorios, razón por la cual RMDIR es la mejor opción
JCH2k
11

Es posible que tenga algunos archivos de solo lectura, puede usar la opción del / F para deshacerse de ellos usando

     del /S /F your_directory
     rmdir your_directory

También podría tener algunos archivos ocultos y, si está realmente seguro de que desea eliminarlos, puede hacerlo utilizando

     del /S /F /AH your_directory
     rmdir your_directory

Si esto todavía falla, entonces no tiene permiso para eliminar algunos archivos o algunos de los archivos todavía están en uso.

sgmoore
fuente
¡Esta debería ser la respuesta correcta!
jdhao
4

Creo que hay un error en Windows 7 (y quizás en otras versiones) que a veces causa este síntoma; o podría ser un error en el software de terceros. (¿Tiene Symantec Endpoint Protection instalado por casualidad?)

De todos modos, me he encontrado con bastante frecuencia. En la mayoría de los casos, el problema se puede solucionar ejecutando rd /s /qdos o tres veces seguidas.

Si está en un archivo por lotes, puede hacer algo como esto:

rd /s /q foo
if exist foo rd /s /q foo
if exist foo rd /s /q foo
if exist foo echo Help! & pause
Harry Johnston
fuente
Convenido. El uso de rd / s foo, que no tiene la opción / q silent, eliminará todas las subcarpetas por usted, pero debe responder S a la solicitud, por lo que requiere que se atiendan los archivos por lotes. Menos que ideal lo sé.
Anthony
3

Úselo delen los archivos internos, luego rmdirelimine la carpeta.

Para usar el rmdirmétodo para eliminar también todos los archivos, use el /Sinterruptor antes del nombre del directorio y /Qsuprima la solicitud de eliminación. Esta es la mejor manera de hacerlo, ya que no se pierde ningún archivo. Sin embargo, tenga cuidado al usar el modificador / Q, ya que no le advertirá sobre los atributos del sistema o de los archivos ocultos.

El canadiense Luke REINSTATE MONICA
fuente
2

Si usa el nodo , puede usar la dependencia de rimraf de esta manera:

ejecutar instalar: npm install rimraf -g

eliminar carpeta: rimraf SourceFolder

Esto me ayudó cuando recibí el error:

los nombres de los archivos de origen son más grandes de lo que admite el sistema de archivos

Dustin Spengler
fuente
0

Carpeta versiones anteriores de Windows (DOS, Windows 95/98 / ME), DELTREEes el equivalente de RMo RMDIR. Sin DELTREEembargo, utilizo en mi estación de trabajo Windows 7 en archivos por lotes.

Deletes a directory and all the subdirectories and files in it.

To delete one or more files and directories:
DELTREE [/Y] [drive:]path [[drive:]path[...]]

  /Y              Suppresses prompting to confirm you want to delete
                  the subdirectory.
  [drive:]path    Specifies the name of the directory you want to delete.

Note: Use DELTREE cautiously. Every file and subdirectory within the
specified directory will be deleted.
Dom
fuente
0

Creo que puedes usarlo así:

msg*your file is going to delete 
pause
del/s /q "C:\Users\Rd\Desktop\New folder (2)\" 
rmdir /s /q "C:\Users\Rd\Desktop\New folder (2)\"
mkdir "C:\Users\Rd\Desktop\New folder (2)"
Shubham Dwivedi
fuente
1
¡Bienvenido a SU! ¿Por qué voté en contra? 1) Formato deficiente 2) Proporciona la misma solución esencial que ya se publicó hace varios años (¡siempre lea las soluciones publicadas antes de publicar una nueva!) 3) No se ajusta a la pregunta (su solución recrea la carpeta eliminada, que no fue solicitado).
zagrimsan