bioperiodik
Goto Top

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! face-big-smile

Danke schonmal im Vorraus
Gruß Seb

Content-ID: 165761

Url: https://administrator.de/contentid/165761

Ausgedruckt am: 24.11.2024 um 22:11 Uhr

Biber
Biber 06.05.2011 um 09:38:54 Uhr
Goto Top
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]
>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"
[ die Ausgabe von !x! ist nur proof-of-concept.]

Grüße
Biber
Skyemugen
Skyemugen 06.05.2011 um 09:58:24 Uhr
Goto Top
Aloha Biber,

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 face-wink

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
Biber
Biber 06.05.2011 um 10:16:15 Uhr
Goto Top
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. face-wink

Grüße
Biber
bioperiodik
bioperiodik 06.05.2011 um 10:19:09 Uhr
Goto Top
Hi Biber,

Danke für die schnelle Antwort, hab allerdings ein Problem:

Wenn ich die Zeile

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"

in der cmd ausführe, werden einfach alle Dateien angezeigt, also es wird nichts gefiltert.

Was mach ich falsch? Steh grad voll aufm Schlauch!
60730
60730 06.05.2011 um 10:22:46 Uhr
Goto Top
moin,

@ Biber - so früh schon so genial - Ihr habt guten Kaffee face-wink

@ 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>
bioperiodik
bioperiodik 06.05.2011 um 10:32:51 Uhr
Goto Top
Hm...bei mir geht das nicht face-sad

Was hat das mit dem "gesetzte DelayedExpansion ist Bedingung, aber bei mit per Default gesetzt" auf sich?
bastla
bastla 06.05.2011 um 10:35:19 Uhr
Goto Top
Hallo bioperiodik!

Starte die CMD-Shell mit
cmd /V:ON
- ansonsten kann auch in der Registry festgelegt werden (wie es bei Biber und offensichtlich auch T-Mo) der Fall ist, dass "delayedExpansion"aktiv ist.

Grüße
bastla
bioperiodik
bioperiodik 06.05.2011 um 10:44:32 Uhr
Goto Top
Hi,

Daran lags, vielen Dank für eure super schnelle und tolle Hilfe!

Gruß Sebastian
Biber
Biber 06.05.2011 um 10:44:56 Uhr
Goto Top
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
>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