Jede zweite Datei löschen via Batch
Hallo,
Hab ein kleines Problem, aber leider noch keine passende Lösung gefunden:
Wir haben vom Abriss und Neubau eines Gebäude mit einer Webcam jede Minute ein Bild gemacht.
Aus diesen Bildern (ca 900 000 Stück) will ich jetzt einen kleinen Film machen.
Um die Bilder die Nachts gemacht worden sind zu filtern, hab ich schon eine Möglichkeit.
Allerdings sind dann immer noch viel zu viele Bilder übrig.
Jetzt fehlt noch eine Möglichkeit einfach Bilder zu löschen.
Hab gedacht eine Batch die jedes zweite (oder noch besser jedes n-te) Bild in einen neuen Ordner kopiert wäre super.
Allerdings kenn ich mich damit nicht wirklich aus.
Wäre super wenn mir jemand helfen könnte!
Danke schonmal im Vorraus
Gruß Seb
Hab ein kleines Problem, aber leider noch keine passende Lösung gefunden:
Wir haben vom Abriss und Neubau eines Gebäude mit einer Webcam jede Minute ein Bild gemacht.
Aus diesen Bildern (ca 900 000 Stück) will ich jetzt einen kleinen Film machen.
Um die Bilder die Nachts gemacht worden sind zu filtern, hab ich schon eine Möglichkeit.
Allerdings sind dann immer noch viel zu viele Bilder übrig.
Jetzt fehlt noch eine Möglichkeit einfach Bilder zu löschen.
Hab gedacht eine Batch die jedes zweite (oder noch besser jedes n-te) Bild in einen neuen Ordner kopiert wäre super.
Allerdings kenn ich mich damit nicht wirklich aus.
Wäre super wenn mir jemand helfen könnte!
Danke schonmal im Vorraus
Gruß Seb
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 165761
Url: https://administrator.de/contentid/165761
Ausgedruckt am: 24.11.2024 um 22:11 Uhr
9 Kommentare
Neuester Kommentar
Moin bioperiodik,
wenn es doch eine einmalige Aktion ist, dann würde ich die Klamotte eben über den CMD-Prompt abfackeln und mir nicht extra dafür einen teuren Editor zum Batchdatei-Schreiben bestellen.
Wenn du mit dir ausdiskutiert hast, ob du nun jede zweite (oder n-te) Datei löschen oder kopieren willst, dann hangele dich an folgendem Ansatz weiter:
Vorüberlegung :
Jede zweite Datei würde heissen, wenn ich die Dateien "durchzähle", würde jede gerade (=ohne Rest durch durch 2 teilbare) laufende Nummer zu den Guten, jede ungerade ( Zahl modulo 2 ungleich 0) zu den Bösen gehören.
Jede n-te Datei würde heissen, wenn ich die Dateien "durchzähle", würde jede ohne Rest durch durch n teilbare) laufende Nummer zu den Guten, jede "Zahl modulo n ungleich 0" zu den Bösen gehören.
Dann zähl ich doch durch und nehme Modulo.
Proof of concept am CMD-Prompt (gesetzte DelayedExpansion ist Bedingung, aber bei mir per Default gesetzt]
Was ich hier mache ist:
Die FOR/F-Anweisung nimmt davon mit for /f "delims=: tokens=1*" die "Teile/Tokens" 1 und Rest, wenn das Ganze an jedem ":" getrennt wird.
Aus der "laufenden nummer", die in Laufvariable %i steht, errechne ich in Statischer Variable X den Modulo-Wert mit (set /a "x=%i % 2")>nul
Das "verzögert/delayed" aufgelöste Ergebnis, den Genau-Jetzt-Wert von %x%, also !x! zeige ich an, siehe Ausgabe.
Wenn ich dann löschen (oder kopieren) will:
[ die Ausgabe von !x! ist nur proof-of-concept.]
Grüße
Biber
wenn es doch eine einmalige Aktion ist, dann würde ich die Klamotte eben über den CMD-Prompt abfackeln und mir nicht extra dafür einen teuren Editor zum Batchdatei-Schreiben bestellen.
Wenn du mit dir ausdiskutiert hast, ob du nun jede zweite (oder n-te) Datei löschen oder kopieren willst, dann hangele dich an folgendem Ansatz weiter:
Vorüberlegung :
Jede zweite Datei würde heissen, wenn ich die Dateien "durchzähle", würde jede gerade (=ohne Rest durch durch 2 teilbare) laufende Nummer zu den Guten, jede ungerade ( Zahl modulo 2 ungleich 0) zu den Bösen gehören.
Jede n-te Datei würde heissen, wenn ich die Dateien "durchzähle", würde jede ohne Rest durch durch n teilbare) laufende Nummer zu den Guten, jede "Zahl modulo n ungleich 0" zu den Bösen gehören.
Dann zähl ich doch durch und nehme Modulo.
Proof of concept am CMD-Prompt (gesetzte DelayedExpansion ist Bedingung, aber bei mir per Default gesetzt]
>for /f "delims=: tokens=1,2" %i in ('dir *.txt /a-D /o-d /b^|findstr /n $') do @(set /a "x=%i % 2")>nul & @echo !x! [%i][%j]
1 [1][such.txt]
0 [2][prefs.txt]
1 [3][test4findstr.txt]
0 [4][temp2345.txt]
1 [5][alleDwgs.txt]
0 [6][exceldat.txt]
1 [7][Dokument4.txt]
0 [8][getNTLog.txt]
1 [9][neroerr.txt]
0 [10][logfile.txt]
1 [11][werte.txt]
0 [12][RevInfo.txt]
1 [13][findstrhelp.txt]
0 [14][MessSub.txt]
1 [15][set_of_000.txt]
0 [16][rsmoutput.txt]
1 [17][ipconfig.txt]
Was ich hier mache ist:
for /f "delims=: tokens=1*" %i in ('dir *.txt /a-D /o-d /b^|findstr /n $') do @(set /a "x=%i % 2")>nul & @echo !x! [%i][%j]
In der FOR/F-Innenklammer:dir *.txt /a-D /o-d /b^|findstr /n $ => Liste alle Dateien *.txt auf und nummeriere die mit FindStr durch. Kannst du separat antesten.Die FOR/F-Anweisung nimmt davon mit for /f "delims=: tokens=1*" die "Teile/Tokens" 1 und Rest, wenn das Ganze an jedem ":" getrennt wird.
Aus der "laufenden nummer", die in Laufvariable %i steht, errechne ich in Statischer Variable X den Modulo-Wert mit (set /a "x=%i % 2")>nul
Das "verzögert/delayed" aufgelöste Ergebnis, den Genau-Jetzt-Wert von %x%, also !x! zeige ich an, siehe Ausgabe.
Wenn ich dann löschen (oder kopieren) will:
>for /f "delims=: tokens=1*" %i in ('dir *.txt /a-D /o-d /b^|findstr /n $') do @(set /a "x=%i % 2")>nul & @if !x!==1 echo !x! del "%j"
1 del "such.txt"
1 del "test4findstr.txt"
1 del "alleDwgs.txt"
1 del "Dokument4.txt"
1 del "neroerr.txt"
1 del "werte.txt"
1 del "findstrhelp.txt"
1 del "set_of_000.txt"
1 del "ipconfig.txt"
Grüße
Biber
Aloha Biber,
kannst du mir eben mal auf die Sprünge helfen, ich bin mir nicht ganz im Klaren, wann man sinnvollerweise
greetz André
P.S.: Hm und ich wollte erst eine temporäre txt schreiben lassen, war mir nicht bewusst, dass
kannst du mir eben mal auf die Sprünge helfen, ich bin mir nicht ganz im Klaren, wann man sinnvollerweise
findstr /n $
und wann findstr /n "^"
einsetzt, wovon mache ich das abhängig? In dem Beispiel hier dürfte ja beides funktionieren aber dem ist ja nicht immer so, allerdings bin ich nie dahintergestiegen greetz André
P.S.: Hm und ich wollte erst eine temporäre txt schreiben lassen, war mir nicht bewusst, dass
findstr /n $
auch einfach bei dir
funktioniert *pfeif* still learning, long way to go
Moin Skyemugen,
eigentlich hat jede Plaintext-Dateizeile einen Zeilenanfang (im Findstr-Slang "^") und ein Zeilenende CRLF ($).
Im wahren Leben hat aber oft die letzte Zeile keinen Zeilenumbruch (was kein Schwein sieht ausser wenn es "FindStr $" heisst).
Bei der DIR-Ausgabe gehe ich davon aus, dass sich die letzte ausgegebene Zeile nicht von der 3ten oder 17ten unterscheidet -
alle Zeilen sind gleich und alle Zeilen haben auch ein CRLF == $ am Ende.
Aus Sicherheitserwägungen würde ich sonst -auch wieder eigentlich - immer eine Prüfung auf "Zeilenanfang" == "^" empfehlen.
Ausser eben wenn die Faulheit stärker ist als Sicherheitsdenken.
Grüße
Biber
eigentlich hat jede Plaintext-Dateizeile einen Zeilenanfang (im Findstr-Slang "^") und ein Zeilenende CRLF ($).
Im wahren Leben hat aber oft die letzte Zeile keinen Zeilenumbruch (was kein Schwein sieht ausser wenn es "FindStr $" heisst).
Bei der DIR-Ausgabe gehe ich davon aus, dass sich die letzte ausgegebene Zeile nicht von der 3ten oder 17ten unterscheidet -
alle Zeilen sind gleich und alle Zeilen haben auch ein CRLF == $ am Ende.
Aus Sicherheitserwägungen würde ich sonst -auch wieder eigentlich - immer eine Prüfung auf "Zeilenanfang" == "^" empfehlen.
Ausser eben wenn die Faulheit stärker ist als Sicherheitsdenken.
Grüße
Biber
moin,
@ Biber - so früh schon so genial - Ihr habt guten Kaffee
@ bioperiodik:
Kann ich nicht nachvollziehen...
@ Biber - so früh schon so genial - Ihr habt guten Kaffee
@ bioperiodik:
Kann ich nicht nachvollziehen...
C:\!pix>dir *.jpg
Datenträger in Laufwerk C: ist ..
Volumeseriennummer: xxxxxxxxxxxxxx
Verzeichnis von C:\!pix
12.02.2010 14:41 1.499.803 IMG_0019.jpg
18.06.2010 16:15 1.494.721 IMG_0307.jpg
18.06.2010 16:16 1.552.860 IMG_0308.jpg
17.12.2009 16:50 1.539.607 js-mini.jpg
17.12.2009 16:33 67.492 WP_HST_209.jpg
5 Datei(en) 6.154.483 Bytes
0 Verzeichnis(se), 36.006.580.224 Bytes frei
C:\!pix>dir *.jpg /a-D /o-d
Datenträger in Laufwerk C: ist ..
Volumeseriennummer: xxxxxxxxxxxxxx
Verzeichnis von C:\!pix
18.06.2010 16:16 1.552.860 IMG_0308.jpg
18.06.2010 16:15 1.494.721 IMG_0307.jpg
12.02.2010 14:41 1.499.803 IMG_0019.jpg
17.12.2009 16:50 1.539.607 js-mini.jpg
17.12.2009 16:33 67.492 WP_HST_209.jpg
5 Datei(en) 6.154.483 Bytes
0 Verzeichnis(se), 36.006.199.296 Bytes frei
C:\!pix>
C:\!pix>for /f "delims=: tokens=1*" %i in ('dir *.jpg /a-D /o-d /b^|findstr /n $
') do @(set /a "x=%i % 2")>nul & @if !x!==1 echo !x! del "%j"
1 del "IMG_0308.jpg"
1 del "IMG_0019.jpg"
1 del "WP_HST_209.jpg"
C:\!pix>
Moin bioperiodik, moin alle anderen Frühaufsteher,
sorry für die unvollständige Kontextbeschreibung und danke @bastla für das schnelle Einspringen.
Wenn du am CMD-Prompt ein "Cmd /?" eingibst, dann sind zwei Zeilen dabei, in denen auf die REGkeys verwiesen wird.
Bei mir sind die in etwas so gesetzt
--> der relevante Key dabei ist "DelayedExpansion"
Bastlas Alternavie ist genauso fein (also cmd /V:on).
Im Batch ist es alles erledigt (also auch ohne Regkeys oder /V:on) mit "Setlocal EnableDelayedExpansion"
Grüße
Biber
sorry für die unvollständige Kontextbeschreibung und danke @bastla für das schnelle Einspringen.
Wenn du am CMD-Prompt ein "Cmd /?" eingibst, dann sind zwei Zeilen dabei, in denen auf die REGkeys verwiesen wird.
Bei mir sind die in etwas so gesetzt
>cmd /?|findstr /i "delayed"
HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\DelayedExpansion
HKEY_CURRENT_USER\Software\Microsoft\Command Processor\DelayedExpansion
>reg query "HKEY_CURRENT_USER\Software\Microsoft\Command Processor"
! REG.EXE VERSION 3.0
HKEY_CURRENT_USER\Software\Microsoft\Command Processor
CompletionChar REG_DWORD 0x9
DefaultColor REG_DWORD 0x74
EnableExtensions REG_DWORD 0x1
PathCompletionChar REG_DWORD 0x9
DisableUNCCheck REG_DWORD 0x1
DelayedExpansion REG_DWORD 0x1
Autorun REG_SZ D:\Biber\_1\cmdstartup.bat
--> der relevante Key dabei ist "DelayedExpansion"
Bastlas Alternavie ist genauso fein (also cmd /V:on).
Im Batch ist es alles erledigt (also auch ohne Regkeys oder /V:on) mit "Setlocal EnableDelayedExpansion"
Grüße
Biber