Digamos que hay una variable llamada %pathtofolder%
, ya que deja en claro que es una ruta completa de una carpeta.
Quiero eliminar todos los archivos y subcarpetas de este directorio, pero no el directorio en sí.
Pero, podría haber un error como 'este archivo / carpeta ya está en uso' ... cuando eso suceda, debería continuar y omitir ese archivo / carpeta.
¿Hay algún comando para esto?
rm -rf path\to\folder
funciona en Windows 10 (o podría provenir de Git Bash ... ¡de cualquier manera si tienes que probarlo!)Respuestas:
Puede usar este script de shell para limpiar la carpeta y los archivos dentro de la
C:\Temp
fuente :Cree un archivo por lotes (por ejemplo, delete.bat) que contenga el comando anterior. Vaya a la ubicación donde se encuentra el archivo delete.bat y luego ejecute el comando: delete.bat
fuente
%p
rmdir
es mi comando favorito de todos los tiempos para el trabajo. Funciona para eliminar grandes archivos y carpetas con subcarpetas. No se crea una copia de seguridad, así que asegúrese de haber copiado sus archivos de forma segura antes de ejecutar este comando.Esto elimina silenciosamente la carpeta y todos los archivos y subcarpetas.
fuente
md FOLDERNAME
(vea la respuesta de @rakoczyn a continuación).cd "FOLDERNAME"
RD . /S /Q
La solución más simple que se me ocurre es eliminar todo el directorio con
Luego creando este directorio nuevamente:
fuente
Esto eliminará las carpetas y archivos y dejará la carpeta atrás.
fuente
2>nul
, genera "El proceso no puede acceder al archivo porque está siendo utilizado por otro proceso".RD /?
le mostrará la manera simple de vaciar una carpeta.CD mypath && RD /S .
sería suficiente. Sin embargo, no me gusta que tengas que repetir tu camino dos veces, para caminos largos se hace difícil de leer. Así que simplemente agregaría unset p="mypath"
al principio.... elimina todos los archivos y carpetas debajo del directorio dado, pero no el directorio en sí.
fuente
/A
de eliminar también los archivos con un conjunto de atributos ocultos y%dir%\*
debe encerrarse entre comillas dobles"%dir%\*"
para trabajar también para directorios que contienen un espacio o uno de estos caracteres&()[]{}^=;!'+,`~
. Y la línea de comando FOR debe modificarsefor /F "eol=| delims=" %%I in ('dir "%dir%\*" /AD /B 2^>nul') do rd /Q /S "%dir%\%%I"
porque FOR ignora los directorios con un conjunto de atributos ocultos. DIR con opciones/AD /B
genera todos los directorios con solo sus nombres. Por cierto:dir
no es un buen nombre para una variable de entorno.Recibirá un mensaje de error que le indica que el comando RMDIR no puede acceder a la carpeta actual, por lo que no puede eliminarlo.
Actualización :
A partir de este útil comentario (gracias a Moritz Both ), puede agregar
&&
entre, porRMDIR
lo que no se ejecutará si elCD
comando falla (por ejemplo, nombre de directorio mal escrito):De la referencia de línea de comandos de Windows :
fuente
cd [Your_Folder]
es súper crítico - Voy a tener que recordar que lo que no elimine el directorio en sí mismo ...&&
entre los comandos en lugar del salto de línea y estará a salvo de un CD defectuoso.RD significa REMOVE Directory.
/ S: elimina todos los archivos y subcarpetas además de la carpeta misma. Use esto para eliminar un árbol de carpetas completo.
/ Q: Silencioso: no muestra la confirmación SN
Ejemplo:
fuente
/S
y/Q
mediard
es equivalentermdir
y eliminará el directorio en sí y no es lo que OP quiere.Yo uso Powershell
Eliminará el contenido de la carpeta, no la carpeta en sí.
fuente
powershell -Command "Remove-Item 'PathToMyDirectory\*' -Recurse -Force"
Ninguna de las respuestas publicadas el 2018-06-01, con la excepción de la línea de comando única publicada por foxidrive , realmente eliminó todos los archivos y todas las carpetas / directorios
%PathToFolder%
. Esa es la razón para publicar una respuesta más con una línea de comando única muy simple para eliminar todos los archivos y subcarpetas de una carpeta, así como un archivo por lotes con una solución más compleja que explica por qué todas las otras respuestas publicadas en 2018-06-01 usando DEL y FOR con RD no pudo limpiar una carpeta por completo.La solución de línea de comando simple simple que, por supuesto, también se puede usar en un archivo por lotes:
Esta línea de comando contiene tres comandos ejecutados uno después del otro.
El primer comando PUSHD empuja la ruta del directorio actual en la pila y luego crea
%PathToFolder%
el directorio actual para ejecutar el proceso del comando.Esto también funciona para las rutas UNC de forma predeterminada debido a que las extensiones de comando están habilitadas de forma predeterminada y en este caso PUSHD crea una letra de unidad temporal que apunta a ese recurso de red especificado y luego cambia la unidad y el directorio actuales, utilizando la letra de unidad recién definida.
PUSHD emite el siguiente mensaje de error para manejar STDERR si el directorio especificado no existe en absoluto:
Este mensaje de error se suprime al redirigirlo
2>nul
al dispositivo NUL .El siguiente comando RD se ejecuta solo si el cambio del directorio actual para el proceso de comando actual al directorio especificado fue exitoso, es decir, el directorio especificado existe.
El comando RD con las opciones
/Q
y/S
elimina un directorio silenciosamente con todos los subdirectorios incluso si el directorio especificado contiene archivos o carpetas con atributos ocultos o con un conjunto de atributos de solo lectura. El atributo del sistema nunca impide la eliminación de un archivo o carpeta.No eliminados son:
Carpetas utilizadas como el directorio actual para cualquier proceso en ejecución. No se puede eliminar todo el árbol de carpetas de dicha carpeta si se usa una carpeta como el directorio actual para cualquier proceso en ejecución.
Los archivos abiertos actualmente por cualquier proceso en ejecución con permisos de acceso a archivos establecidos en el archivo abierto para evitar la eliminación del archivo mientras está abierto por la aplicación / proceso en ejecución. Tal archivo abierto evita también la eliminación de todo el árbol de carpetas al archivo abierto.
Archivos / carpetas en los que el usuario actual no tiene los permisos requeridos (NTFS) para eliminar el archivo / carpeta, lo que impide también la eliminación del árbol de carpetas a este archivo / carpeta.
Esta línea de comando utiliza la primera razón para no eliminar una carpeta para eliminar todos los archivos y subcarpetas de la carpeta especificada, pero no la carpeta en sí. La carpeta se convierte temporalmente en el directorio actual para ejecutar el proceso de comando que impide la eliminación de la carpeta en sí. Por supuesto, esto da como resultado la salida de un mensaje de error mediante el comando RD :
Archivo es el término incorrecto aquí, ya que en realidad la carpeta está siendo utilizada por otro proceso, el proceso de comando actual que ejecutó el comando RD . Bueno, en realidad una carpeta es para el sistema de archivos un archivo especial con un directorio de atributos de archivo que explica este mensaje de error. Pero no quiero profundizar demasiado en la gestión del sistema de archivos.
Este mensaje de error, como todos los demás mensajes de error, que podría ocurrir debido a las tres razones escritas anteriormente, se suprime al redirigirlo
2>nul
desde el controlador STDERR al dispositivo NUL .El tercer comando, POPD , se ejecuta independientemente del valor de salida del comando RD .
POPD abre la ruta del directorio empujada por PUSHD desde la pila y cambia el directorio actual para ejecutar el proceso de comando a este directorio, es decir, restaura el directorio actual inicial. POPD elimina la letra de unidad temporal creada por PUSHD en caso de una ruta de carpeta UNC.
Nota: POPD puede fallar silenciosamente al restaurar el directorio actual inicial en caso de que el directorio actual inicial fuera un subdirectorio del directorio para limpiar que ya no existe. En este caso especial
%PathToFolder%
permanece el directorio actual. Por lo tanto, es recomendable ejecutar la línea de comando anterior no desde un subdirectorio de%PathToFolder%
.Un hecho más interesante : probé la línea de comando también usando una ruta UNC al compartir el directorio local
C:\Temp
con el nombre compartidoTemp
y usando la ruta UNC\\%COMPUTERNAME%\Temp\CleanTest
asignada a la variable de entornoPathToFolder
en Windows 7. Si el directorio actual al ejecutar la línea de comando es un subdirectorio de un local compartido La carpeta a la que se accede mediante la ruta UNC, es decirC:\Temp\CleanTest\Subfolder1
,Subfolder1
es eliminada por RD , y el siguiente POPD falla silenciosamente alC:\Temp\CleanTest\Subfolder1
volver a crear el directorio actual, lo que resulta enZ:\CleanTest
el directorio actual para el proceso de comando en ejecución. Entonces, en este caso muy especial, la letra de unidad temporal permanece hasta que se cambie el directorio actual, por ejemplo concd /D %SystemRoot%
a un directorio local realmente existente. Desafortunadamente POPDno sale con un valor mayor de 0 si no puede restaurar el directorio actual inicial, lo que hace imposible detectar esta condición de error muy especial usando solo el código de salida de POPD . Sin embargo, se puede suponer que nadie se encuentra con este caso de error muy especial ya que las rutas UNC generalmente no se utilizan para acceder a archivos y carpetas locales.Para comprender aún mejor los comandos utilizados, abra una ventana de símbolo del sistema, ejecute allí los siguientes comandos y lea la ayuda que se muestra para cada comando con mucho cuidado.
pushd /?
popd /?
rd /?
Una sola línea con múltiples comandos usando el archivo por lotes de Windows explica los operadores
&&
y se&
usa aquí.A continuación, veamos la solución de archivo por lotes utilizando el comando DEL para eliminar archivos
%PathToFolder%
y FOR y RD para eliminar las subcarpetas%PathToFolder%
.El archivo por lotes primero se asegura de que la variable de entorno
PathToFolder
esté realmente definida con una ruta de carpeta sin comillas dobles y sin una barra diagonal inversa al final. La barra diagonal inversa al final no sería un problema, pero las comillas dobles en una ruta de carpeta podrían ser problemáticas debido a que el valor dePathToFolder
se concatena con otras cadenas durante la ejecución del archivo por lotes.Importantes son las dos líneas:
El comando DEL se usa para eliminar todos los archivos en el directorio especificado.
/A
es necesaria para procesar realmente todos los archivos, incluidos los archivos con el atributo oculto que DEL ignoraría sin usar la opción/A
./F
es necesaria para forzar la eliminación de archivos con el conjunto de atributos de solo lectura./Q
es necesaria para ejecutar una eliminación silenciosa de varios archivos sin preguntar al usuario si realmente se deben eliminar varios archivos.>nul
es necesario para redirigir la salida de los nombres de archivo escritos para manejar STDOUT al dispositivo NUL del cual no se puede eliminar debido a que un archivo está abierto actualmente o el usuario no tiene permiso para eliminar el archivo.2>nul
es necesario redirigir la salida del mensaje de error para cada archivo que no se puede eliminar del identificador STDERR al dispositivo NUL .Los comandos FOR y RD se utilizan para eliminar todos los subdirectorios en el directorio especificado. Pero
for /D
no se usa porque FOR ignora en este caso los subdirectorios con el conjunto de atributos ocultos. Por esa razón,for /F
se utiliza para ejecutar la siguiente línea de comando en un proceso de comando separado que se inicia en segundo plano con%ComSpec% /c
:Las salidas DIR en formato simple debido a
/B
las entradas de directorio con atributoD
, es decir, los nombres de todos los subdirectorios en el directorio especificado independientemente de otros atributos como el atributo oculto sin una ruta.2>nul
se utiliza para redirigir la salida del mensaje de error por DIR en ningún directorio encontrado del identificador STDERR al dispositivo NUL .El operador de redirección
>
debe escapar con el carácter de intercalación^
, en la línea de comando FOR para ser interpretado como un carácter literal cuando el intérprete de comandos de Windows procesa esta línea de comando antes de ejecutar el comando FOR que ejecuta ladir
línea de comando incrustada en un proceso de comando separado iniciado en el fondo.FOR procesa la salida capturada escrita para manejar STDOUT de un proceso de comando iniciado que son los nombres de los subdirectorios sin ruta y nunca encerrados entre comillas dobles.
FOR con opción
/F
ignora las líneas vacías que no aparecen aquí ya que DIR con opción/B
no genera líneas vacías.FOR también ignoraría las líneas que comienzan con un punto y coma, que es el carácter predeterminado de final de línea. Un nombre de directorio puede comenzar con un punto y coma. Por esa razón,
eol=|
se utiliza para definir el carácter de barra vertical como el carácter de fin de línea que ningún directorio o archivo puede tener en su nombre.FOR dividiría la línea en subcadenas usando espacio y tabulación horizontal como delimitadores y asignaría solo la primera cadena delimitada por espacio / tabulación a la variable de bucle especificada
I
. Aquí no se desea este comportamiento de división debido a que un nombre de directorio puede contener uno o más espacios. Pordelims=
lo tanto, se utiliza para definir una lista vacía de delimitadores para deshabilitar el comportamiento de división de línea y asignarse a la variable de bucleI
, siempre el nombre completo del directorio.El comando FOR ejecuta el comando RD para cada nombre de directorio sin una ruta, razón por la cual en la línea de comando RD la ruta de la carpeta debe especificarse una vez más, que se concatena con el nombre de la subcarpeta.
Para comprender los comandos utilizados y cómo funcionan, abra una ventana de símbolo del sistema, ejecute allí los siguientes comandos y lea con cuidado todas las páginas de ayuda que se muestran para cada comando.
del /?
dir /?
echo /?
endlocal /?
for /?
goto /?
if /?
rd /?
rem /?
set /?
setlocal /?
fuente
Use el Bloc de notas para crear un documento de texto y copiar / pegar esto:
Seleccione Guardar como y nombre de archivo:
Guardar como tipo: todos los archivos y haga clic en el Savebotón.
Funciona en cualquier tipo de cuenta (administrador o usuario estándar). ¡Solo ejecútalo!
Yo uso una variable temporal en este ejemplo, ¡pero puedes usar cualquier otra! PD: ¡Solo para el sistema operativo Windows!
fuente
Para eliminar el archivo:
Para eliminar la carpeta con todos los archivos en ella:
Eliminar todos los archivos de una carpeta específica (no eliminar la carpeta en sí) es un poco complicado.
del /s *.*
no puede eliminar carpetas, pero elimina archivos de todas las subcarpetas. Entonces se necesitan dos comandos:fuente
/A
de eliminar también archivos con conjunto de atributos ocultos y la opción/F
de eliminar también archivos con conjunto de atributos de solo lectura y comillas dobles alrededor del último argumento. Entoncesdel /A /F /Q "PATH_TO_FOLDER\*"
sería mejor. Y la línea de comando FOR debe modificarsefor /F "eol=| delims=" %%I in ('dir "PATH_TO_FOLDER\*" /AD /B 2^>nul') do rd /Q /S "PATH_TO_FOLDER\%%I"
porque FOR ignora los directorios con un conjunto de atributos ocultos. DIR con opciones/AD /B
genera todos los directoriosPATH_TO_FOLDER
con solo sus nombres.Puede hacerlo utilizando el siguiente comando para eliminar todo el contenido y la carpeta principal en sí:
fuente
Intenté varios de estos enfoques, pero ninguno funcionó correctamente.
Encontré este enfoque de dos pasos en la línea de comandos de Windows del sitio :
Funcionó exactamente como lo necesitaba y según lo especificado por el OP.
fuente
forfiles /P "%pathtofolder%" /M * /C "%SystemRoot%\System32\cmd.exe /C if @isdir==FALSE (del /A /F @file) else rd /Q /S @file"
DEL/A
se agrega para eliminar también los archivos con el conjunto de atributos ocultos, ya que de lo contrario DEL generaría un mensaje de error no encontrado para cada archivo oculto%pathtofolder%
. La opción DEL/F
se agrega para eliminar también archivos con el atributo de solo lectura establecido,%pathtofolder%
ya que de lo contrario DEL generaría un mensaje de error de acceso denegado.cmd.exe
instancia para cada archivo y cada directorio%pathtofolder%
. La ventaja es que FORFILES no ignora los directorios con atributos ocultos establecidos como FOR .fuente
for /F "eol=| delims=" %%I in ('dir "%TEMP%\*" /AD /B 2^>nul') do rd /Q /S "%TEMP%\%%I"
porque FOR ignora los directorios con un conjunto de atributos ocultos. DIR con opciones/AD /B
genera todos los directorios%TEMP%
con solo sus nombres.Utilizar:
Esto elimina todos los archivos y subcarpetas
%pathtofolder%
, incluidos los archivos de solo lectura, y no solicita confirmación.fuente