Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Jede zweite Datei löschen via Batch

Frage Entwicklung Batch & Shell

Mitglied: bioperiodik

bioperiodik (Level 1) - Jetzt verbinden

06.05.2011 um 08:13 Uhr, 9896 Aufrufe, 9 Kommentare

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
Mitglied: Biber
06.05.2011 um 09:38 Uhr
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
Bitte warten ..
Mitglied: Skyemugen
06.05.2011 um 09:58 Uhr
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

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
Bitte warten ..
Mitglied: Biber
06.05.2011 um 10:16 Uhr
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
Bitte warten ..
Mitglied: bioperiodik
06.05.2011 um 10:19 Uhr
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!
Bitte warten ..
Mitglied: 60730
06.05.2011 um 10:22 Uhr
moin,

@ 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>
Bitte warten ..
Mitglied: bioperiodik
06.05.2011 um 10:32 Uhr
Hm...bei mir geht das nicht

Was hat das mit dem "gesetzte DelayedExpansion ist Bedingung, aber bei mit per Default gesetzt" auf sich?
Bitte warten ..
Mitglied: bastla
06.05.2011 um 10:35 Uhr
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
Bitte warten ..
Mitglied: bioperiodik
06.05.2011 um 10:44 Uhr
Hi,

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

Gruß Sebastian
Bitte warten ..
Mitglied: Biber
06.05.2011 um 10:44 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Neuere Datei per Batch ausfinding machen (2)

Frage von chattie zum Thema Batch & Shell ...

Batch & Shell
gelöst Texteil anhand zweier Vorgaben aus Datei löschen (12)

Frage von tiforst zum Thema Batch & Shell ...

Windows Server
gelöst Datei per Batch in Ordner mit sich ständig änderndem Namen kopieren (3)

Frage von Drxrey zum Thema Windows Server ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...