Löschen Sie alle Dateien eines bestimmten Typs (Erweiterung) mithilfe einer Batchdatei rekursiv in einem Verzeichnis

84

Ich muss alle JPG- und TXT-Dateien (zum Beispiel) in dir1 und dir2 löschen.

Was ich versucht habe war:

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

In einigen Verzeichnissen hat es funktioniert; in anderen nicht.

Zum Beispiel hat dies nichts bewirkt:

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

Was fehlt mir im zweiten Ausschnitt? Warum hat es nicht funktioniert?

ärgerlich
quelle
Es wäre hilfreich, wenn Sie weitere Informationen darüber bereitstellen würden , wie genau es "nicht funktioniert" hat. Wie unterscheidet sich das tatsächliche Ergebnis vom erwarteten Ergebnis? Erhalten Sie eine Fehlermeldung? Welche?
Ansgar Wiechers

Antworten:

202

Sie können mit dem delBefehl Platzhalter verwenden und /Sdies rekursiv tun.

del /S *.jpg

Nachtrag

@BmyGuest fragte, warum eine herabgestimmte Antwort ( del /s c:\*.blaawbg) anders sei als meine Antwort.

Es gibt einen großen Unterschied zwischen Laufen del /S *.jpgund del /S C:\*.jpg. Der erste Befehl wird vom aktuellen Speicherort aus ausgeführt , während der zweite auf dem gesamten Laufwerk ausgeführt wird .

In dem Szenario, in dem Sie jpgDateien mit dem zweiten Befehl löschen , funktionieren einige Anwendungen möglicherweise nicht mehr und Sie verlieren alle Ihre Familienbilder. Dies ist äußerst ärgerlich, aber Ihr Computer kann weiterhin ausgeführt werden.

Wenn Sie jedoch an einem Projekt arbeiten und alle Ihre dllDateien in löschen möchten myProject\dll, führen Sie die folgende Batchdatei aus:

@echo off

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

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

Dann entfernen Sie alle dllDateien von Ihrem C:\Laufwerk. Alle Ihre Anwendungen funktionieren nicht mehr, Ihr Computer wird unbrauchbar und beim nächsten Neustart werden Sie in die vierte Dimension teleportiert, in der Sie für immer stecken bleiben.

Die Lektion hier besteht darin, einen solchen Befehl nicht direkt im Stammverzeichnis eines Laufwerks (oder an einem anderen Ort auszuführen, der möglicherweise gefährlich ist, z. B. %windir%), wenn Sie dies vermeiden können. Führen Sie sie immer so lokal wie möglich aus.

Laf
quelle
3
Durch Anhängen einer Zeile pauseam Ende kann der Benutzer die vollständigen Protokollinformationen anzeigen.
KNU
2
Danke für den Nachtrag, Laf. Ich denke, es wird anderen helfen, diesen wirklich wichtigen Unterschied zu erkennen.
BmyGuest
Wenn jemand aus einem bestimmten Verzeichnis löschen möchte, können Sie cdund delBefehle mit "&" kombinieren , siehe stackoverflow.com/q/8055371/7429464
FindOutIslamNow
@FindOutIslamNow oder Sie können den vollständigen Pfad im delBefehl angeben , ohne das aktuelle Verzeichnis ändern zu müssen.
Laf
Nur eine kleine Einschränkung - es wird ein Fehler verursacht, wenn keine zu löschenden Dateien gefunden werden.
Jamie Marshall
4

Ich habe vor einiger Zeit ein Batch-Skript geschrieben, mit dem Sie eine zu löschende Dateierweiterung auswählen können. Das Skript sucht in dem Ordner, in dem es sich befindet, und in allen Unterordnern nach Dateien mit dieser Erweiterung und löscht sie.

@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

Hoffe, dass dies für jeden nützlich ist, der es will :)

Pyroglyphe
quelle
Wenn Sie Bash installiert haben (Cygwin, WSL usw.), reicht alternativ eine einfache find . -name "*.ext" -type f -delete(wobei ext die von Ihnen gewählte Erweiterung ist) aus.
Pyroglyphe
3

Sie können dies verwenden, um ALLE Dateien in einem Ordner und Unterordnern zu löschen:

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

Oder verwenden Sie diese Option, um nur bestimmte Dateitypen zu löschen:

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

Ich habe nicht genug Ruf, um einen Kommentar hinzuzufügen, deshalb habe ich dies als Antwort gepostet. Aber für das ursprüngliche Problem mit diesem Befehl:

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

Dem ersten For fehlt die rekursive Syntax. Es sollte sein:

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

Sie können einfach tun:

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

um die tatsächliche Ausgabe anzuzeigen.

Der lange Nguyen
quelle
0

Das ist es:

@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: Ersetze folder_path durch deinen Ordner

ajcg
quelle
-11

Wenn Sie versuchen, bestimmte .extensions im Laufwerk C: zu löschen, verwenden Sie dieses cmd:

del /s c:\*.blaawbg

Ich hatte einen Kunden, der einen Verschlüsselungsvirus hatte, und ich musste alle Junk-Dateien finden und löschen.

Tommy Mosher
quelle
13
Dies scheint erschreckend unsicher.
Dudewad
5
Was ist der Hauptunterschied zwischen dieser Antwort (-2 Stimmen) und der akzeptierten (+42 Stimmen)?
BmyGuest
6
@BmyGuest Der Hauptunterschied besteht darin, dass wenn Sie meinen Befehl irgendwo in einem Unterordner ausführen, dies nur die Dateien betrifft, die sich unter diesem Unterordner befinden. In dieser Antwort löschen Sie alles , was mit dem Dateinamen im gesamten Laufwerk übereinstimmt. Wenn Sie also einige DLL-Dateien in Ihrem Projekt löschen möchten und versehentlich tippen del /s c:\*.dll, stehen Sie vor einer sehr schlechten Überraschung. Führen Sie solche Befehle niemals auf dem gesamten Laufwerk aus, es sei denn, dies ist unbedingt erforderlich.
Laf
2
Ich denke nicht, dass diese Antwort so viele Abstimmungen verdient. Die Antwort erklärt, dass dieser Befehl für das gesamte Laufwerk gilt (und warum). c:sollte durch den gewünschten Ordner ersetzt werden, wenn die Person nicht das gesamte Laufwerk haben möchte.
Benutzer1527152
2
Ich denke, es braucht so viele Abstimmungen, wenn nicht mehr, als Haftungsausschluss und Warnung, was nicht zu tun ist. Sie könnten die Dinge wirklich vermasseln, indem Sie Code wie diesen kopieren, einfügen und ausführen. Es gibt viele Ostereier, die in Bash eingebaut sind, um genau diese Lektion auf "sichere" Weise zu lehren. Dieses Beispiel könnte Ihren Tag ruinieren. Beste!
Jacktrader