force - Cómo eliminar archivos/subcarpetas en un directorio específico en el símbolo del sistema en Windows
remove file in windows cmd (15)
Esto eliminará las carpetas y archivos y dejará la carpeta atrás.
pushd "%pathtofolder%" && (rd /s /q "%pathtofolder%" 2>nul & popd)
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 sucede, solo debe continuar y omitir ese archivo / carpeta.
¿Alguien puede darme un comando para esto?
La solución más sencilla que se me ocurre es eliminar todo el directorio con
RD /S /Q folderPath
Luego creando este directorio de nuevo:
MD folderPath
Ninguna de las respuestas publicadas en 2018-06-01 con excepción de la línea de comandos única publicada por foxidrive realmente eliminó todos los archivos y todas las carpetas / directorios en %PathToFolder%
. Esa es la razón para publicar una respuesta más con la línea de comando simple y 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 demás respuestas se publicaron el 2018-06-01 usando DEL y FOR with RD no pudo limpiar una carpeta completamente.
La solución simple de línea de comando que, por supuesto, también se puede utilizar en un archivo por lotes:
pushd "%PathToFolder%" 2>nul && ( rd /Q /S "%PathToFolder%" 2>nul & popd )
Esta línea de comando contiene tres comandos ejecutados uno después del otro.
El primer comando PUSHD inserta la ruta del directorio actual en la pila y luego hace que %PathToFolder%
el directorio actual para ejecutar el proceso del comando.
Esto funciona también para las rutas UNC de forma predeterminada porque las extensiones de comando están habilitadas de forma predeterminada y, en este caso, PUSHD crea una letra de unidad temporal que apunta al 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:
El sistema no puede encontrar la ruta especificada.
Este mensaje de error se suprime redirigiéndolo con 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 se eliminan son:
Carpetas utilizadas como directorio actual para cualquier proceso en ejecución. El árbol de carpetas completo a dicha carpeta no se puede eliminar si una carpeta se utiliza como directorio actual para cualquier proceso en ejecución.
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. Dicho archivo abierto también evita la eliminación de todo el árbol de carpetas del archivo abierto.
Archivos / carpetas en los que el usuario actual no tiene los permisos necesarios (NTFS) para eliminar el archivo / carpeta, lo que también impide la eliminación del árbol de carpetas en este archivo / carpeta.
El primer motivo para no eliminar una carpeta lo utiliza esta línea de comando 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, lo que impide la eliminación de la carpeta. Por supuesto, esto da como resultado la salida de un mensaje de error por el comando RD :
El proceso no puede acceder al archivo porque está siendo usado por otro proceso.
Archivo es el término incorrecto aquí, ya que en realidad la carpeta está siendo utilizada por otro proceso, el comando actual que ejecutó el comando RD . Bueno, en realidad, una carpeta es para el sistema de archivos un archivo especial con el 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 los tres motivos escritos anteriormente, se suprime redirigiéndolo con 2>nul
desde el identificador STDERR al dispositivo NUL .
El tercer comando POPD se ejecuta de manera independiente en el valor de salida del comando RD .
POPD muestra la ruta del directorio empujada por PUSHD desde la pila y cambia el directorio actual para ejecutar el proceso de comando en 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 en el directorio actual. Por lo tanto, es recomendable ejecutar la línea de comandos que se encuentra arriba, no desde un subdirectorio de %PathToFolder%
.
Un dato más interesante :
También probé la línea de comandos usando una ruta UNC compartiendo el directorio local C:/Temp
con el nombre de Temp
y utilizando la ruta UNC //%COMPUTERNAME%/Temp/CleanTest
asignado a la variable de entorno PathToFolder
en Windows 7. Si el directorio actual está en ejecución la línea de comandos es un subdirectorio de la carpeta local compartida a la que se accede mediante la ruta UNC, es decir, C:/Temp/CleanTest/Subfolder1
, la Subfolder1
se elimina por RD y el siguiente POPD falla silenciosamente al hacer que C:/Temp/CleanTest/Subfolder1
vuelva a ser el directorio actual dando como resultado que Z:/CleanTest
permanezca como directorio actual para el proceso de comando en ejecución. Entonces, en este caso muy especial, la letra de la unidad temporal permanece hasta que el directorio actual se cambia, por ejemplo, con cd /D %SystemRoot%
a un directorio local realmente existente. Desafortunadamente, POPD no sale con un valor mayor a 0 si no puede restaurar el directorio actual inicial, lo que hace imposible detectar esta condición de error muy especial con solo salir del código de POPD . Sin embargo, se puede suponer que nadie se topa con este caso de error tan especial, ya que las rutas UNC generalmente no se usan para acceder a los archivos y carpetas locales.
Para comprender aún mejor los comandos utilizados, abra una ventana del símbolo del sistema, ejecute los siguientes comandos y lea la ayuda que se muestra para cada comando con mucho cuidado.
-
pushd /?
-
popd /?
-
rd /?
Una línea con varios comandos utilizando el archivo por lotes de Windows explica los operadores &&
y &
utilizados aquí.
A continuación, veamos la solución de archivos por lotes con el comando DEL para eliminar archivos en %PathToFolder%
y FOR y RD para eliminar las subcarpetas en %PathToFolder%
.
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Clean the folder for temporary files if environment variable
rem PathToFolder is not defined already outside this batch file.
if not defined PathToFolder set "PathToFolder=%TEMP%"
rem Remove all double quotes from folder path.
set "PathToFolder=%PathToFolder:"=%"
rem Consisted the folder path only of double quotes?
if not defined PathToFolder goto EndCleanFolder
rem Remove a backslash at end of folder path.
if "%PathToFolder:~-1%" == "/" set "PathToFolder=%PathToFolder:~0,-1%"
rem Consisted folder path only of a backslash (with one or more double quotes)?
if not defined PathToFolder goto EndCleanFolder
rem Delete all files in specified folder including files with hidden
rem or read-only attribute set, except the files currently opened by
rem a running process which prevents deletion of the file while being
rem opened by the application, or on which the current user has not
rem the required permissions to delete the file.
del /A /F /Q "%PathToFolder%/*" >nul 2>nul
rem Delete all subfolders in specified folder including those with hidden
rem attribute set recursive with all files and subfolders, except folders
rem being the current directory of any running process which prevents the
rem deletion of the folder and all folders above, folders containing a file
rem opened by the application which prevents deletion of the file and the
rem entire folder structure to this file, or on which the current user has
rem not the required permissions to delete a folder or file in folder tree
rem to delete.
for /F "eol=| delims=" %%I in (''dir "%PathToFolder%/*" /AD /B 2^>nul'') do rd /Q /S "%PathToFolder%/%%I" 2>nul
:EndCleanFolder
endlocal
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 invertida al final. La barra invertida al final no sería un problema, pero las comillas dobles en la ruta de la carpeta podrían ser problemáticas debido a que el valor de PathToFolder
se concatena con otras cadenas durante la ejecución del archivo por lotes.
Importantes son las dos líneas:
del /A /F /Q "%PathToFolder%/*" >nul 2>nul
for /F "eol=| delims=" %%I in (''dir "%PathToFolder%/*" /AD /B 2^>nul'') do rd /Q /S "%PathToFolder%/%%I" 2>nul
El comando DEL se utiliza para eliminar todos los archivos en el directorio especificado.
- La opción
/A
es necesaria para procesar realmente todos los archivos, incluidos los archivos con atributos ocultos, que EL ignoraría sin usar la opción/A
- La opción
/F
es necesaria para forzar la eliminación de archivos con un conjunto de atributos de solo lectura. - La opción
/Q
es necesaria para ejecutar una eliminación silenciosa de varios archivos sin/Q
al usuario si realmente se deben eliminar múltiples archivos. -
>nul
es necesario para redirigir la salida de los nombres de archivo escritos para manejar STDOUT al dispositivo NUL que no se puede eliminar porque el archivo está actualmente abierto o el usuario no tiene permiso para eliminar el archivo. -
2>nul
es necesario para redireccionar la salida del mensaje de error para cada archivo que no se puede eliminar desde el 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 los subdirectorios con el conjunto de atributos ocultos. Por esa razón, for /F
se utiliza para ejecutar la siguiente línea de comandos en un proceso de comando separado iniciado en segundo plano con cmd.exe /C
:
dir "%PathToFolder%/*" /AD /B 2>nul
Las salidas de DIR en formato simple debido a /B
las entradas de directorio con el atributo D
, es decir, los nombres de todos los subdirectorios en el directorio especificado, independientes en otros atributos como atributo oculto sin ruta. 2>nul
se usa para redireccionar la salida del mensaje de error por DIR en ningún directorio encontrado desde el identificador STDERR al dispositivo NUL .
El operador de redireccionamiento >
debe escaparse con el carácter de intercalación ^
en la línea de comando FOR para que se interprete 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 la línea de comando dir
integrada en un proceso de comando separado iniciado en segundo plano.
FOR procesa la salida capturada escrita para manejar STDOUT del proceso de comando iniciado, que son los nombres de los subdirectorios sin ruta y nunca 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 de fin de línea predeterminado. Un nombre de directorio puede comenzar con un punto y coma. Por eso eol=|
se utiliza para definir el carácter de barra vertical como el carácter de final de línea que ningún directorio o archivo puede tener en su nombre.
FOR dividiría la línea en subcadenas utilizando espacio y tabulación horizontal como delimitadores y asignaría solo la primera secuencia delimitada por espacio / tabulador a la variable de bucle especificada I
Este comportamiento de división no se desea aquí porque un nombre de directorio puede contener uno o más espacios. Por delims=
tanto, delims=
se usa para definir una lista vacía de delimitadores para deshabilitar el comportamiento de división de líneas y asignarse a la variable de bucle I
siempre el nombre completo del directorio.
El comando FOR ejecuta el comando RD para cada nombre de directorio sin ruta, razón por la cual, en la línea de comandos de 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 los siguientes comandos y lea todas las páginas de ayuda que se muestran con mucho cuidado.
-
del /?
-
dir /?
-
echo /?
-
endlocal /?
-
for /?
-
goto /?
-
if /?
-
rd /?
-
rem /?
-
set /?
-
setlocal /?
Para borrar el archivo:
del PATH_TO_FILE
Para eliminar la carpeta con todos los archivos en ella:
rmdir /s /q PATH_TO_FOLDER
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. Así que se necesitan dos comandos:
del /q PATH_TO_FOLDER/*.*
for /d %i in (PATH_TO_FOLDER/*.*) do @rmdir /s /q "%i"
Probé varios de estos enfoques, pero ninguno funcionó correctamente.
Encontré este enfoque de dos pasos en la línea de comandos de Windows del sitio:
forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==FALSE del @file"
forfiles /P %pathtofolder% /M * /C "cmd /c if @isdir==TRUE rmdir /S /Q @file"
Funcionó exactamente como lo necesitaba y según lo especificado por el OP.
Puede hacerlo usando el siguiente comando para eliminar todos los contenidos y la carpeta principal:
RMDIR [/S] [/Q] [drive:]path
Puede usar este script de shell para limpiar la carpeta y los archivos dentro de la source C:/Temp
:
del /q "C:/Temp/*"
FOR /D %%p IN ("C:/Temp/*.*") DO rmdir "%%p" /s /q
Cree un archivo de proceso 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
RD significa eliminar directorio.
/ S: elimina todos los archivos y subcarpetas además de la carpeta en sí. Use esto para eliminar un árbol de carpetas completo.
/ Q: silencioso - no mostrar la confirmación de YN
Ejemplo:
RD /S /Q C:/folder_path/here
Use el bloc de notas para crear un documento de texto y copie / pegue esto:
rmdir /s/q "%temp%"
mkdir "%temp%"
Seleccione guardar como, Nombre de archivo:
delete_temp.bat
Guardar como tipo: Todos los archivos y haga clic en el botón Guardar.
Trabaja en cualquier tipo de cuenta (administrador o usuario estándar), simplemente ejecútalo. Yo uso la variable temporal en este ejemplo, ¡pero puedes usar cualquier otra! ps Para el sistema operativo Windows solamente!
Yo uso Powershell
Remove-Item c:/scripts/* -recurse
Se eliminará el contenido de la carpeta, no la carpeta en sí.
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.
RMDIR "FOLDERNAME" /S /Q
Esto elimina silenciosamente la carpeta y todos los archivos y subcarpetas.
@ECHO OFF
Set dir=path-to-dir
Echo Deleting all files from %dir%
del %dir%/* /F /Q
Echo Deleting all folders from %dir%
for /d %%p in (%dir%/*) Do rd /Q /S "%%p"
@echo Folder deleted.
exit
... elimina todos los archivos y carpetas debajo del directorio dado, pero no el directorio en sí.
@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%/*.*"
rem next line cleans up the folder''s content
FOR /D %%p IN ("%temp%/*.*") DO RD "%%p" /S /Q
CD [Your_Folder]
RMDIR /S /Q .
Recibirá un mensaje de error, le dice que el comando RMDIR no puede acceder a la carpeta actual, por lo que no puede eliminarla.
Actualización :
A partir de this útil comentario (gracias a Moritz Both ), puede agregar &&
between, por lo que RMDIR
no se ejecutará si falla el comando del CD
(por ejemplo, el nombre de directorio mal escrito):
CD [Your_Folder] && RMDIR /S /Q .
Desde la referencia de línea de comandos de Windows :
/ S: elimina un árbol de directorios (el directorio especificado y todos sus subdirectorios, incluidos todos los archivos).
/ Q: Especifica el modo silencioso. No solicita confirmación al eliminar un árbol de directorios. (Tenga en cuenta que / q funciona solo si se especifica / s.)
del %pathtofolder%/*.* /s /f /q
elimine todos los archivos y subcarpetas en% pathtofolder%, incluidos los archivos de solo lectura, no solicite confirmación