¿Equivalente "rm -rf" para Windows?

509

Necesito una forma de eliminar recursivamente una carpeta y sus elementos secundarios.

¿Existe una herramienta preconstruida para esto o necesito escribir una?

DEL /S no elimina directorios.

DELTREE fue eliminado de Windows 2000+

FlySwat
fuente
1
¿Del / s (a) no funciona en absoluto (solo está disponible en algunas versiones) o (b) deja el directorio de nivel superior pero elimina todo lo que está debajo de él o (c) deja todos los directorios mientras elimina todos los archivos?
wnoise
@ Aaron, responda c, debe usar rmdir / s para eliminar directorios y archivos.
Wedge
31
¿No es realmente format c:entonces la instalación de Linux? Estoy bromeando, por supuesto.
Basile Starynkevitch

Respuestas:

694

RMDIR o RD si está utilizando el símbolo del sistema clásico (cmd.exe):

rd /s /q "path"

RMDIR [/ S] [/ Q] [unidad:] ruta

RD [/ S] [/ Q] [unidad:] ruta

/ S Elimina todos los directorios y archivos en el directorio especificado además del directorio en sí. Se usa para eliminar un árbol de directorios.

/ Q Modo silencioso, no pregunte si está bien para eliminar un árbol de directorios con / S

Si está utilizando PowerShell puede utilizar Remove-Item(que es un alias a del, erase, rd, ri, rmy rmdir), y toma un -Recurseargumento que puede ser cortocircuitado a-r

rd -r "path"
Duncan Smart
fuente
84
Vale la pena señalar que para grandes cantidades de archivos, rmdir / s / q es típicamente significativamente más rápido que la operación equivalente "seleccionar dir, shift + eliminar" en el explorador.
Wedge
99
Esto no elimina archivos, como rm -rf, y también devuelve un valor distinto de cero cuando el directorio no existe, por rd /s /q foo && echo "yay"lo que fallará si el directorio "foo" no existe.
Dirk Groeneveld
17
¿Qué pasa si dir. ¿No está vacío y se obtienen algunos archivos Access is deniedy otros The process cannot access the file because it is being used by another process?
Eugene
66
Acabo de probar esto en siete y debes hacer / S y / Q (mayúsculas)
prefecto ford
2
Desconcertado aquí. Yo que probé este comando y no funcionó si había archivos en el árbol de directorios; ahora vuelvo y. . . mágicamente parece funcionar. ¿Alguien más experimenta un comportamiento inconsistente con esto?
Alex Hall
139

administración:

takeown /r /f folder
cacls folder /c /G "ADMINNAME":F /T
rmdir /s folder

Funciona para cualquier cosa, incluidos los archivos sys

EDITAR: En realidad, encontré la mejor manera que también resuelve el problema de la ruta del archivo durante demasiado tiempo:

mkdir \empty
robocopy /mir \empty folder
wbkang
fuente
3
¡Mi héroe! Y un consejo: creas tu carpeta vacía en C: \ empty, luego, una vez dentro de cada carpeta loca, solo puedes hacerrobocopy /mir c:\empty .
Léon Pelletier el
Esto takeownme ayudó mientras copiaba la carpeta del sistema Linux con rsync por error y no tenía privilegios para eliminar esa carpeta ... Ni siquiera la robocopy funcionó. Gracias
Jarda
1
Muy buena respuesta. Funciona. (todas las demás respuestas en la página no). Pero cacls está en desuso. ¿Es posible hacer una respuesta contemporánea, por favor? La segunda variante ya funciona y no está en desuso.
Gangnus
Esto no hace nada por mí. ¿Podría alguien explicar cómo se supone que debe funcionar? (robocopy) - Puede eliminar el contenido de las carpetas, pero no las carpetas en sí
Ralf
114

RMDIR [/S] [/Q] [drive:]path

RD [/S] [/Q] [drive:]path

  • /S Elimina todos los directorios y archivos en el directorio especificado, además del directorio en sí. Se usa para eliminar un árbol de directorios.

  • /Q Modo silencioso, no pregunte si está bien para eliminar un árbol de directorios con /S

Jim McKeeth
fuente
13
Gracias por la explicación del parámetro. La respuesta aceptada no hace esto, desafortunadamente.
Thomas
1
La respuesta más simple y perfecta a la pregunta. Debería ser el aceptado.
Artif3x
19

Puede instalar cygwin, que tiene rmasí como lsetc.

usuario17481
fuente
19

Vaya a la ruta y active este comando.

rd /s /q "FOLDER_NAME"

/ s: elimina el directorio especificado y todos los subdirectorios, incluidos los archivos. Use / s para eliminar un árbol.

/ q: ejecuta rmdir en modo silencioso. Elimina directorios sin confirmación.

/? : Muestra ayuda en el símbolo del sistema.

Sireesh Yarlagadda
fuente
9

Para eliminar un directorio (ya sea que exista o no) use lo siguiente:

if exist myfolder ( rmdir /s/q myfolder )
Arcilla
fuente
6

rmdir /S /Q %DIRNAME%

Branan
fuente
6

La respuesta aceptada es excelente, pero suponiendo que tenga Node instalado, puede hacerlo de manera mucho más precisa con la biblioteca de nodos "rimraf", que permite patrones globales. Si usa esto mucho (lo hago), simplemente instálelo globalmente.

yarn global add rimraf

entonces, por ejemplo, un patrón que uso constantemente:

rimraf .\**\node_modules

o para una línea que le permite esquivar la instalación global, pero que lleva un poco más de tiempo para la descarga dinámica del paquete:

npx rimraf .\**\node_modules
Artif3x
fuente
2
Una solución sólida al problema, ya que es independiente del sistema operativo.
Denialos
5

Prueba este comando:

del /s foldername
Jeremy Ruten
fuente
funcionó para mí en combinación w / rmdir / s / q ya que algunos archivos estaban bloqueados y rmdir fallaba en esos. del / foldername destruyó los archivos bloqueados que luego permitieron a rmdir deshacerse del directorio raíz. Agradable.
bbqchickenrobot
4

rmdir / s dirname

Brian Mitchell
fuente
4

Primero, repasemos lo que rm -rfhace:

C:\Users\ohnob\things>touch stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>mkdir stuff.txt

C:\Users\ohnob\things>rm -rf stuff.txt

C:\Users\ohnob\things>ls -l
total 0

C:\Users\ohnob\things>rm -rf stuff.txt

Hay tres escenarios en los que rm -rfse usa comúnmente donde se espera que regrese 0:

  1. La ruta especificada no existe.
  2. La ruta especificada existe y es un directorio.
  3. La ruta especificada existe y es un archivo.

Voy a ignorar todo el tema de los permisos, pero nadie usa permisos ni intenta negarse a sí mismo el acceso de escritura a las cosas en Windows de todos modos (OK, eso es una broma ...).

Primero establezca ERRORLEVELen 0 y luego elimine la ruta solo si existe, utilizando diferentes comandos dependiendo de si es o no un directorio. IF EXISTno se establece ERRORLEVELen 0 si la ruta no existe, por lo ERRORLEVELque es necesario establecerlo en 0 primero para detectar correctamente el éxito de una manera que imite el rm -rfuso normal . Proteger el RDcon IF EXISTes necesario porque RD, a diferencia rm -f, arrojará un error si el objetivo no existe.

El siguiente fragmento de script supone que DELPATH está precomillado. (Esto es seguro cuando haces algo como SET DELPATH=%1. Intenta poner ECHO %1un .cmdy pasarle una discusión con espacios en él y ver qué pasa por ti mismo). Después de que se complete el fragmento, puede verificar si hay fallas IF ERRORLEVEL 1.

: # Determine whether we need to invoke DEL or RD or do nothing.
SET DELPATH_DELMETHOD=RD
PUSHD %DELPATH% 2>NUL
IF ERRORLEVEL 1 (SET DELPATH_DELMETHOD=DEL) ELSE (POPD)
IF NOT EXIST %DELPATH% SET DELPATH_DELMETHOD=NOOP
: # Reset ERRORLEVEL so that the last command which
: # otherwise set it does not cause us to falsely detect
: # failure.
CMD /C EXIT 0
IF %DELPATH_DELMETHOD%==DEL DEL /Q %DELPATH%
IF %DELPATH_DELMETHOD%==RD RD /S /Q %DELPATH%

El punto es que todo es más simple cuando el entorno simplemente se ajusta a POSIX. O si instala un MSYS mínimo y simplemente lo usa.

binki
fuente
3

Aquí está lo que tú necesitas hacer...

Cree un archivo por lotes con la siguiente línea

RMDIR /S %1

Guarde su archivo por lotes como Remove.baty póngalo enC:\windows

Cree la siguiente clave de registro

HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)

Inicie regedity actualice el valor predeterminado HKEY_CLASSES_ROOT\Directory\shell\Remove Directory (RMDIR)\default con el siguiente valor

"c:\windows\REMOVE.bat" "%1"

¡Eso es! Ahora puede hacer clic derecho en cualquier directorio y usar la función RMDIR

Louis
fuente
3

Usando Powershell 5.1

 get-childitem *logs* -path .\ -directory -recurse | remove-item -confirm:$false -recurse -force

Reemplace los registros con el nombre del directorio que desea eliminar.

get-childitem busca el directorio secundario con el nombre de forma recursiva desde la ruta actual (.).

remove-item elimina el resultado.

Nueva York
fuente
2

Puede instalar GnuWin32 y usar los comandos * nix de forma nativa en Windows. Instalo esto antes de instalar cualquier otra cosa en una copia fresca de Windows. :)

epochwolf
fuente
2

ÚSELO BAJO SU PROPIO RIESGO. INFORMACIÓN PROPORCIONADA "TAL CUAL". NO PROBADO EXTENSIVAMENTE.

Haga clic con el botón derecho en el icono de Windows (generalmente en la parte inferior izquierda)> haga clic en "Windows PowerShell (Administrador)"> use este comando (con el debido cuidado, puede eliminar fácilmente todos sus archivos si no tiene cuidado):

rd -r -include *.* -force somedir

¿Dónde somedirestá el directorio no vacío que desea eliminar?

Tenga en cuenta que con los discos externos adjuntos, o discos con problemas, Windows a veces se comporta de forma extraña: no produce errores en la eliminación (o en ningún intento de copia), pero el directorio no se elimina (o no se copia) como se indica. (Descubrí que en este caso, al menos para mí, el comando dado por @n_y en su respuesta producirá errores como 'get-childitem: el archivo o directorio está dañado e ilegible' como resultado en PowerShell)

Roel Van de Paar
fuente
1

TARDE PERO RESPUESTA IMPORTANTE para cualquier persona que tenga problemas para instalar paquetes npm en la máquina Windows y si ve un error que dice " rm -rf..." no se encontró el comando. Puede usar bash cli para ejecutar el comando rm en Windows.

para los usuarios de npm, puede cambiar la configuración de npm de npm config set script-shell "C:\Program Files\Git\bin\bash.exe"esta manera si el paquete npm que está intentando instalar tiene un script posterior a la instalación que usa el rm -rfcomando, podrá ejecutar ese rmcomando sin necesidad de cambiar nada en el paquete npm o deshabilitar la configuración de scripts posteriores a la instalación. (Por ejemplo, styled-componentsusa el rmcomando en sus scripts posteriores a la instalación)

Si solo quieres usar el rmcomando, puedes usar fácilmente el bash y pasar los argumentos.

Entonces, sí, puede usar el comando 'rm' en Windows.

AKC
fuente
0

Esto es lo que funcionó para mí:

Solo intenta disminuir la longitud del camino. es decir :: Cambiar el nombre de todas las carpetas que conducen a dicho archivo a los nombres más pequeños posibles. Diga los nombres de una letra. Continúe renombrando hacia arriba en la jerarquía de carpetas. Con esto, efectivamente reduce la longitud del camino. Ahora finalmente intente eliminar el archivo de inmediato.

Gaurav Deochakke
fuente
-1

También hay deltree si estás en una versión anterior de Windows.

Realmente me gusta este sitio para encontrar comandos: SS64: Del - Eliminar archivos

Jason Wadsworth
fuente
-2

del / s / q directorytobedeleted

joe
fuente
2
Intenta agregar alguna descripción / explicación.
Rajen Raiyarela