Batch bestimmten Dateityp NICHT löschen / ausschließen

froggy-the-frog

Cadet 2nd Year
Registriert
Sep. 2010
Beiträge
24
Hallo Leute,

folgendes Problem:
Ich habe einen Ordner voller Fotos. In diesem Ordner liegen aber auch noch diverse andere Dateien mit rum, die jetzt da verschwinden sollen.

Was ich möchte:
Eine Batchdatei, die mir alle Dateien löscht, die nicht die Endungen .jpg und .png besitzen.

Meine Batchkenntnisse reichen nur soweit, dass ich mich quasi mit /? in der Kommandozeile durchklicken kann, allerdings komme ich mit den Schleifen nicht so richtig klar, die ich hierbei vermutlich benötige...
Laut meinem Verständnis wäre im Grunde das Folgende zu tun:
Suche alle Dateien unter Ausschluss von .jpg und .png und lösche diese.

Könnt ihr mir helfen?

Vielen Dank schon mal!
 
Mit dem löschen wäre ich sehr vorsichtig. Da kann schnell was daneben gehen.

Sind es einzelne Ordner oder viele Ordner?

Ich würde das ganze so angehen, dass ich alles Kopiere (oder verschiebe) was .jpg und .png als Endung hat.

Dann kannst du den Rest selbst weglöschen.
 
Kannst einfach über einen temp ordner erledigen.

temp ordner im fotoordner erstellen
alle jpg und png dahin verschieben
alles was übrig ist löschen
dateien zurück verschieben
temp ordner löschen

müsste ungefähr so aussehen, ohne garantie
Code:
md temp
move *.jpg temp
move *.png temp
del *.*
move temp\*.* .
rd temp
 
Zuletzt bearbeitet:
wenns einmalig ist, über die dateiendung sortieren und dann halt den ganzen anderen mist rauslöschen.

Wenn du wirklich ne batch datei brauchst weil es zb ein täglich wiederkehrender prozess ist, würde ich attrib und del in einer batch kombinieren, also durch attrib *.*, jpg und png sicherstellen dass nur die jpg und png dateien ein gewähltes attrib aufweisen und den ganzen anderen kram mit del /a usw rauskicken

hab mir mal sowas vor ein jahr eingerichtet, funktioniert tadellos, gibt sicherlich aber auch einfacherere lösungen ;)


edit: marcols lösung funktioniert natürlich auch, kann aber beim kopieren von vielen dateien deutlich langsamer sein
 
Zuletzt bearbeitet:
Der Ansatz von Urlauber33 könnte so aussehen.
Code:
@echo off
attrib +R +A +H *.png
attrib +R +A +H *.jpg 
attrib +R +A +H *.bat
del /q *.*
attrib -R -A -H *.png
attrib -R -A -H *.jpg
del.bat mit dem code erstellen und davor in einem Temp Verzeichnis einmal durch testen.
 
Entilzha schrieb:
Der Ansatz von Urlauber33 könnte so aussehen.
del.bat mit dem code erstellen und davor in einem Temp Verzeichnis einmal durch testen.

Achtung!

Niemals eine Batchdatei so nennen wie einen Batch Befehl, dass kann zu misteriösem Verhalten führen.
 
Hallo,

du kannst folgendes benutzen:

Code:
for /F "tokens=*" %%i in ('dir /a-D /s /b^|findstr /V ".[jpg|png]$"') do echo "%%i"

Ich lasse die Dateien nur ausgeben, nicht löschen. Teste es und ändere es dann entsprechend!
Das Skript geht vom aktuellen Verzeichnis rekursiv vor! (Das heißt, wenn du nicht aufpasst, löscht du mehr als du willst!)

P.S. Backups sind wirklich oft sehr nützlich! :-)

Gruß
 
Zuletzt bearbeitet:
Ich hätte vielleicht noch erwähnen sollen, dass es sich um eine Ordnerstruktur (relativ viele Unterordner) handelt...

z.B.:
Fotos
. 2010
... Münster
... Duisburg
..... Montag
..... Freitag
. 2011
... Hamburg
usw.

Daher fallen die Verschiebe- und Kopier-Codes wohl schon mal weg.

Aber danke für die Hilfen bisher, ich werde mal ein wenig rumprobieren! :)

----- edit -----

m1-jdgag schrieb:
Hallo,

du kannst folgendes benutzen:

Code:
for /F "tokens=*" %%i in ('dir /a-D /s /b^|findstr /V ".[jpg|png]$"') do echo "%%i"

Ich lasse die Dateien nur ausgeben, nicht löschen. Teste es und ändere es dann entsprechend!
Das Skript geht vom aktuellen Verzeichnis rekursiv vor! (Das heißt, wenn du nicht aufpasst, löscht du mehr als du willst!)

P.S. Backups sind wirklich oft sehr nützlich! :-)

Gruß

DAS hat mir sehr geholfen! Vielen Dank! :)

Mein Code sieht nun so aus:

attrib +R +A +H "loeschen.bat"
for /F "tokens=*" %%i in ('dir /a-D /s /b^|findstr /V ".[jpg|png]$"') do del "%%i"
attrib -R -A -H "loeschen.bat"

----- edit 2 -----

Wie kriege ich es nun noch hin, dass auch Systemdateien (z.B. solche *.ini-Dateien - keine Sorge, werden definitiv nicht benötigt) gelöscht werden?

Hatte es so versucht:

for /F "tokens=*" %%i in ('dir /a-D /s /b^|findstr /V ".[jpg|png]$"') do (
attrib -R -A -H *.*
attrib +R +A +H "loeschen.bat"
del "%%i"
attrib -R -A -H "loeschen.bat"
)

Doch das klappt nicht... Was ich mir dabei gedacht habe: Suche nach den beiden Endungen in den Unterordnern und setze die Attribute bei allen auf Kein Schreibschutz und Nicht versteckt, danach schütze meine Batchdatei, lösche alles bis auf die Bilder und setze zuletzt die Attribute der Batchdatei wieder zurück.
 
Zuletzt bearbeitet:
Hallo,

wie wäre es mit einem Dateimanager wie zB TotalCommander.

Der erledigt diese Aufgabe mit 3 Mausklicks.

Grüße,

Blubbs
 
Nun, ich möchte dafür keine extra Software installieren.
Doch interessehalber: wie löst ein anderer Dateimanager das Problem - also was sind die Schritte / Mausklicks, die man dazu tun muss?
 
Also erstmal solltest du das Skript außerhalb deiner Verzeichnisstruktur ablegen und den Pfad beim "dir" Befehl einsetzen, dann musst du die Batch auch nicht so "schützen" wie du das machst. Und dann schau mal mittels "dir /?" ob nicht für solche Fälle eine Option vorhanden ist. Ich würds ja selber schauen, aber ich schreibe gerade vom iPohne :)
Ergänzung ()

So, da haste. Den Pfad noch anpassen und wieder mit echo zum testen!

Code:
@echo off
set pathname="c:\users\froggy\pictures"
pushd %pathname%
if ERRORLEVEL 1 (goto EOF)
for /F "tokens=*" %%i in ('dir /a/a-D/b/s^|findstr /v ".[jpg|png]$"') do echo "%%i"
popd
:EOF
Ergänzung ()

Ach und hör nicht auf diese Windowsnutzer, die für jedes kleinere Problem gleich Programm XY empfehlen. Du machst das schon richtig, wenn du mit den vorhandenen Mitteln dein Problem zu lösen versuchst. Noch besser wäre, wenn du dann auch versuchst zu verstehen, was da genau vor sich geht!
 
Zuletzt bearbeitet:
Super, vielen Dank!

Das mit dem Verstehen ist so ein Ding...
Ich versuch es mal - nach meinem Verständnis - zu "übersetzen":

@echo off
-> Ausgabe aus
set pathname="c:\users\froggy\pictures"
-> Pfad der durchsucht werden soll wird als Variable pathname deklariert
pushd %pathname%
-> pathname wird bei %% genutzt
if ERRORLEVEL 1 (goto EOF)
-> wenn ein Fehler auftritt, dann gehe zur Sprungmarke EOF
for /F "tokens=*" %%i in ('dir /a/a-D/b/s^|findstr /v ".[jpg|png]$"') do echo "%%i"
-> for-Schleife bei der alle Dateien in %% (pathname) durchsucht und nach den beiden Endungen geprüft werden. Wenn das nicht zutrifft, werden die jeweiligen Dateien ausgegeben
popd
-> pathname wird wieder aus %% entzogen
:EOF
-> Sprungmarke

Passt das soweit, was ich mir dabei gedacht habe?

Etwas ist mir noch aufgefallen: Die Erkennung funktioniert z.B. nicht bei den Dateiendungen ".a" und ".ab" oder ".b" - bei ".x" hingegen funktioniert sie...
Woran könnte das liegen?

Ach ja, noch etwas: wie ist das mit versteckten Dateien? Wie kriege ich diese mit dieser Batchdatei gelöscht? Wie schon erwähnt funktioniert das mit den Attributen setzen wohl nicht so richtig...
 
Zuletzt bearbeitet:
löscht verstecke Dateien
Code:
del /a:h *.*
 
froggy-the-frog schrieb:
Nun, ich möchte dafür keine extra Software installieren.
Doch interessehalber: wie löst ein anderer Dateimanager das Problem - also was sind die Schritte / Mausklicks, die man dazu tun muss?

Hallo,

jeder Dateimanager beherrscht das markieren nach Schemata. Also markierst Du zB alle Dateien mit der Endung (x,y,z) und löscht sie...

Ich nutze den Totalcommander schon Ewigkeiten und es gibt nichts einfacherers in Sachen Dateimanagement.

Grüße,

Blubbs
 
Zuletzt bearbeitet:
Also pushd wechselt in das Verzeichnis. Ähnlich wie ein CD. Popd geht zurück ins vorige Verzeichnis.
Ich hatte "dir" um /a erweitert, dadurch werden auch versteckte und Systemdateien berücksichtigt.
Das Problem mit manchen Endungen kann ich mir noch nicht erklären. Vielleicht postest du mal ein paar vollständige Dateinamen (inkl. Pfad)
 
Dateimanager lösen das per rekursiver Suche, in der CMD funktioniert das nur wenn die Befehlserweiterung aktiv ist. Da der Total Commander ein kostenpflichtiges Programm ist, Free Commander Portabel. ;)

Die Attribut-Methode ist auch keine schlechte Lösung. Alle Dateien zuerst auf den gleichen Attribut-Level setzten und dann die Dateiendungen entsprechend zurücksetzen.
 
Zurück
Oben