Elimine todos los archivos de tipo específico (extensión) de forma recursiva en un directorio utilizando un archivo por lotes

84

Necesito eliminar todos los archivos .jpg y .txt (por ejemplo) en dir1 y dir2.

Lo que probé fue:

@echo off
FOR %%p IN (C:\testFolder D:\testFolder) DO FOR %%t IN (*.jpg *.txt) DO del /s %%p\%%t

En algunos directorios funcionó; en otros no lo hizo.

Por ejemplo, esto no hizo nada:

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

¿Qué me estoy perdiendo en el segundo fragmento? ¿Por qué no funcionó?

vexe
fuente
Sería útil si proporcionara más información sobre cómo exactamente "no funcionó". ¿En qué se diferencia el resultado real del resultado esperado? ¿Recibes un mensaje de error? ¿Cuales?
Ansgar Wiechers

Respuestas:

202

Puede utilizar comodines con el delcomando y /Shacerlo de forma recursiva.

del /S *.jpg

Apéndice

@BmyGuest preguntó por qué una respuesta con voto negativo ( del /s c:\*.blaawbg) era diferente a mi respuesta.

Hay una gran diferencia entre correr del /S *.jpgy del /S C:\*.jpg. El primer comando se ejecuta desde la ubicación actual , mientras que el segundo se ejecuta en todo el disco .

En el caso de que elimine jpgarchivos con el segundo comando, es posible que algunas aplicaciones dejen de funcionar y termine perdiendo todas sus fotos familiares. Esto es absolutamente molesto, pero su computadora aún podrá funcionar.

Sin embargo, si está trabajando en algún proyecto y desea eliminar todos sus dllarchivos myProject\dll, ejecute el siguiente archivo por lotes:

@echo off

REM This short script will only remove dlls from my project... or will it?

cd \myProject\dll
del /S /Q C:\*.dll

Luego terminas eliminando todos los dllarchivos de tu C:\disco. Todas sus aplicaciones dejan de funcionar, su computadora se vuelve inútil y, en el próximo reinicio, es teletransportado a la cuarta dimensión donde estará atrapado por la eternidad.

La lección aquí es no ejecutar dicho comando directamente en la raíz de una unidad (o en cualquier otra ubicación que pueda ser peligrosa, como %windir%) si puede evitarlo. Ejecútelos siempre lo más localmente posible.

Laf
fuente
3
agregar una línea pauseal final permitirá al usuario ver la información completa del registro.
KNU
2
Gracias por el apéndice, Laf. Creo que ayudará a otros a detectar esta diferencia realmente importante.
BmyGuest
Si alguien quiere eliminar de un directorio específico, puede combinar los comandos cdy delcon `& 'consulte stackoverflow.com/q/8055371/7429464
FindOutIslamNow
@FindOutIslamNow o puede especificar la ruta completa en el delcomando, sin tener que cambiar el directorio actual.
Laf
Solo una pequeña advertencia a esto: causará un error si no se encuentran archivos para eliminar.
Jamie Marshall
4

Escribí un script por lotes hace un tiempo que le permite elegir una extensión de archivo para eliminar. El script buscará en la carpeta en la que está y en todas las subcarpetas cualquier archivo con esa extensión y lo eliminará.

@ECHO OFF
CLS

SET found=0
ECHO Enter the file extension you want to delete...
SET /p ext="> "

IF EXIST *.%ext% (           rem Check if there are any in the current folder :)
  DEL *.%ext%
  SET found=1
)
FOR /D /R %%G IN ("*") DO (  rem Iterate through all subfolders
  IF EXIST %%G CD %%G
  IF EXIST *.%ext% (
    DEL *.%ext%
    SET found=1
  )
)

IF %found%==1 (
  ECHO.
  ECHO Deleted all .%ext% files.
  ECHO.
) ELSE (
  ECHO.
  ECHO There were no .%ext% files.
  ECHO Nothing has been deleted.
  ECHO.
)

PAUSE
EXIT

Espero que esto sea útil para cualquiera que lo desee :)

Pyroglyph
fuente
Alternativamente, si tiene Bash instalado (Cygwin, WSL, etc.), una simple find . -name "*.ext" -type f -delete(donde ext es su extensión elegida) será suficiente.
Pyroglyph
3

Puede usar esto para eliminar TODOS los archivos dentro de una carpeta y subcarpetas:

DEL "C:\Folder\*.*" /S /Q

O use esto para eliminar solo ciertos tipos de archivos:

DEL "C:\Folder\*.mp4" /S /Q 
DEL "C:\Folder\*.dat" /S /Q 
StackBuck
fuente
0

No tengo suficiente reputación para agregar comentarios, así que publiqué esto como respuesta. Pero para el problema original con este comando:

@echo off
FOR %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

El primer For carece de sintaxis recursiva, debería ser:

@echo off
FOR /R %%p IN (C:\Users\vexe\Pictures\sample) DO FOR %%t IN (*.jpg) DO del /s %%p\%%t

Puedes simplemente hacer:

FOR %%p IN (C:\Users\0300092544\Downloads\Ces_Sce_600) DO @ECHO %%p

para mostrar la salida real.

El Long Nguyen
fuente
0

eso es todo:

@echo off

:: del_ext
call :del_ext "*.txt"
call :del_ext "*.png"
call :del_ext "*.jpg"

:: funcion del_ext
@echo off
pause
goto:eof
:del_ext
 set del_ext=%1
 del /f /q "folder_path\%del_ext%"
goto:eof

pd: reemplace folder_path con su carpeta

ajcg
fuente
-11

Si está intentando eliminar ciertas extensiones en la unidad C: use este cmd:

del /s c:\*.blaawbg

Tenía un cliente que tenía un virus de cifrado y necesitaba encontrar todos los archivos basura y eliminarlos.

Tommy Mosher
fuente
13
Esto parece terriblemente inseguro.
dudewad
5
¿Cuál es la principal diferencia entre esta respuesta (-2 votos) y la aceptada (+42 votos)?
BmyGuest
6
@BmyGuest La principal diferencia es que si ejecuta mi comando en algún lugar de una subcarpeta, solo afectará a los archivos ubicados en esta subcarpeta. En esta respuesta, elimina todo lo que coincida con el nombre del archivo en toda la unidad. Entonces, si desea eliminar algunos archivos dll en su proyecto, y escribe por error del /s c:\*.dll, entonces está preparado para una muy mala sorpresa. Nunca ejecute dichos comandos en todo el disco, a menos que sea absolutamente necesario.
Laf
2
No creo que esta respuesta merezca tantos votos negativos. La respuesta explica que este comando es para todo el disco (y por qué). c:debe reemplazarse por la carpeta deseada si la persona no quiere el disco completo.
user1527152
2
Creo que necesita tantos votos en contra, si no más, ya que sirve como descargo de responsabilidad y advertencia de lo que no se debe hacer. Realmente podría arruinar las cosas copiando, pegando y ejecutando código como este. Hay muchos huevos de Pascua integrados en bash para enseñar esta lección exacta de una manera "segura" ... este ejemplo podría arruinarle el día. ¡Mejor!
jacktrader