flohhaus
Goto Top

Dateien mit Zahlen im Dateinamen - ungerade oder gerade verschieben

Hallo, ich habe eine Frage:


die Ausgangssituation:

im Ordner <Alle> sind alle Bilder mit hochgezählten Dateinamen : img000001.jpg, img000002.jpg, img000003.jpg, img000004.jpg ...img000010.jpg ,img000011.jpg ...

nun sollen alle Bilder mit geraden Zahlen im Dateinamen in den Ordner <gerade> verschoben werden und alle Dateien mit ungeraden Zahlen im Dateinamen in den Ordner <ungerade> verschoben werden.

ich würde das gerne mit Batch machen, gibt es dazu eine nicht zu komplizierte Möglichkeit?


viele Grüße
Peter

Content-Key: 352724

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

Printed on: April 18, 2024 at 01:04 o'clock

Member: rubberman
Solution rubberman Oct 24, 2017 updated at 19:28:17 (UTC)
Goto Top
Sollte möglich sein.
@echo off &setlocal
set "evenfolder=gerade"  
set "oddfolder=ungerade"  

2>nul md "%evenfolder%"  
2>nul md "%oddfolder%"  
for /f "delims=" %%i in ('dir /a-d /b img*.*') do for /f "delims=imgIMG." %%j in ("%%i") do for /f %%k in ('set /a "1%%j & 1"') do (  
  if %%k equ 0 (
    move "%%i" "%evenfolder%\"  
  ) else (
    move "%%i" "%oddfolder%\"  
  )
)
Lege das Batchscript in das Verzeichnis mit deinen Bildern.

Steffen
Member: flohhaus
flohhaus Oct 24, 2017 at 19:58:26 (UTC)
Goto Top
Hallo Steffen,

vielen Dank für Deine Hilfe!!

ich habe die Batch nun so in mein Verzeichnis erstellt: Die Ordner existieren bereits.

@echo off & setlocal 
set "evenfolder=Gerade" 
set "oddfolder=Ungerade" 
for /f "delims=" %%i in ('dir /a-d /b RIMG*.*') do for /f "delims=rimgRIMG." %%j in ("%%i") do for /f %%k in ('set /a "1%%j & 1"') do ( 
if %%k equ 0 ( 
move "%%i" "%evenfolder%\" 
) else ( 
move "%%i" "%oddfolder%\" 

)

die Batch läuft durch aber ohne was zu machen.
hat es bei Dir funktioniert?

so heissen meine Dateien: RIMG0002.JPG


Grüße
Peter
Member: rubberman
Solution rubberman Oct 24, 2017 at 20:11:41 (UTC)
Goto Top
Ja, hat funktioniert.
Hänge mal ein PAUSE als letzte Zeile an und schau dir die Meldungen an.

Steffen
Member: flohhaus
flohhaus Oct 24, 2017 at 20:32:38 (UTC)
Goto Top
Hallo Steffen,

super Hurra funktioniert!

da waren beim Kopieren am Ende der Zeile Zeichen die gestört haben face-smile
Vielen Dank Steffen!! Funktioniert super.


Viele Grüße
Peter
Member: rubberman
rubberman Oct 24, 2017 at 20:39:29 (UTC)
Goto Top
Super face-smile

Wenn du Code aus dem Forum kopierst - Über dem formatierten Feld gibt es den Link "Quelltext" mit dem du den Code als Plaintext angezeigt bekommst und ohne irgendwelche additionellen Zeichen kopieren kannst.

Steffen
Member: flohhaus
flohhaus Oct 24, 2017 at 20:52:37 (UTC)
Goto Top
Hatte ich zu spät gesehen face-smile Danke

Ich muss morgen mal analysieren, was Du da alles eingebaut hast und die Parameter und so...


Peter
Member: rubberman
rubberman Oct 24, 2017 updated at 21:12:12 (UTC)
Goto Top
Ist keine große Kunst dabei.
- Die äußere Schleife sollte klar sein. Die verarbeitet die Ausgabe des DIR Befehls und weist die Dateinamen nacheinander der Variablen %%i zu.
- Die zweite Schleife nutzt rimgRIMG. als Trennzeichen im Dateinamen. Vorangestellte Trennzeichen werden entfernt, der Punkt trennt die Dateiendung ab. Übrig bleiben deine Ziffern im ersten Token (Substring) die Variable %%j zugewiesen werden.
- Die dritte Schleife ist der Schlüssel zum Erfolg face-wink Als erstes wird durch 1%%j der Ziffernfolge eine 1 vorangestellt. Anderenfalls würden Ziffernfolgen mit vorangestellten Nullen als oktale Zahl interpretiert. Das "bitweise UND 1" (& 1) resultiert zum Ergebnis 0 wenn die Zahl gerade ist, bzw. zu 1 wenn die Zahl ungerade ist. Da die SET /A Anweisung innerhalb der FOR /F Schleife im Kommandozeilenkontext ausgeführt wird, wird das Ergebnis bei fehlender Variablenzuweisung zum Ausgabestream geschrieben, von der FOR /F Schleife verarbeitet und Variable %%k zugewiesen.
- Der Rest ist Vergleichen und Verschieben.

Falls dir das bitweise UND irgendwie suspekt ist, erkläre ich es auch noch mal detaillierter ...

Steffen
Member: flohhaus
flohhaus Oct 25, 2017 at 17:11:15 (UTC)
Goto Top
Hallo Steffen,

vielen Dank für die Erklärung, so wird es gleich übersichtlicher face-smile

Wie arbeitet das Bitweise UND in der Batch?

Peter
Member: rubberman
rubberman Oct 25, 2017 updated at 19:12:39 (UTC)
Goto Top
Hallo Peter

Bitweise Operationen sind nicht auf Batch beschränkt face-wink Aber erst mal von vorn ...

Zahlen in Batch sind 32 Bit breite ganze Zahlen, die im Zweierkomplement dargestellt werden. Um zu verstehen was das heißt und wie bitweise Operationen funktionieren, müssen wir einen Abstecher in binäre Zahlen machen.
Die größte positive Zahl ist 2147483647
(binär 01111111111111111111111111111111)
Die kleinste negative Zahl ist -2147483648
(binär 10000000000000000000000000000000)
In diesem Bereich sind Zahlen mit einer Breite von 32 Bit (0 oder 1) darstellbar. Um die negativen Zahlen müssen wir uns in deinem Fall aber nicht kümmern ...

Jetzt zu den Regeln der bitweisen UND Operation:
0 | 0 | 1 | 1
& | & | & | &
0 | 1 | 0 | 1
-------------
0 | 0 | 0 | 1
Die Tabelle ist spaltenweise von oben nach unten zu lesen. Sie zeigt, welches Ergebnis man erhält, wenn man jeweils ein Bit einer Zahl mit einem Bit an derselben Stelle einer anderen Zahl verrechnet. Wie du siehst, erhält man nur dann eine 1 als Ergebnis, wenn beide Bits 1 sind.

Wenden wir das mal auf ein paar Beispiele an. Ich erspare mir mal die ganzen vorangestellten Nullen und betrachte nur die niedrigsten 8 Bits.
   Bin    Dec

 00000001   1
&00000001  &1
---------  --
 00000001   1

 00000010   2
&00000001  &1
---------  --
 00000000   0

 00000011   3
&00000001  &1
---------  --
 00000001   1

 00000100   4
&00000001  &1
---------  --
 00000000   0
Links die binäre Darstellung, rechts die dezimale Darstellung der Zahlen (so wie du sie in der SET /A Anweisung wiederfindest).
Wie du siehst haben alle geraden Zahlen eine 0 als niedrigstes Bit, während alle ungeraden Zahlen dort eine 1 haben. Die Operation findet immer mit (dezimal) 1 statt, bei der in der binären Darstellung alle Bits 0 sind, bis auf das niedrigste das 1 ist. Wenn du die Regeln der UND Operation anwendest, merkst du, dass du so im Grunde nur das niedrigste Bit betrachten musst. Alle anderen werden immer 0 ergeben. Das niedrigste Bit ist im Resultat auch nur dann 1, wenn es im ersten Operand 1 war (also bei einer ungeraden Zahl).

Genug Mathe fürs erste? face-smile

Steffen
Member: flohhaus
flohhaus Oct 25, 2017 at 19:37:48 (UTC)
Goto Top
Hallo Steffen,

Hut ab!
Vielen Dank für Deine Erklärung. Ich konnte mir bisher nicht vorstellen, wie das binär zu lösen sein soll. Jetzt schon!

Danke auch, dass Du Dich im Forum engagierst! Ich habe eben Deine anderen Beiträge angeschaut, die ich auch noch intensiver lesen werde.
Dank Deiner Erklärung ist mir alles viel klarer, was aber nicht heißt, dass ich mein nächste Projekt ganz ohne Hilfe schaffe. face-smile

Ich werde mich nun noch mehr mit der Bachprogrammierung beschäftigen.

Viele Grüße

Peter
Member: SabSch
SabSch Dec 06, 2019 at 13:05:13 (UTC)
Goto Top
Ich weiß der Thread ist schon lange her, jedoch eine Frage:
Meine Bilder heißen zB 000012_1_1

wie ändere ich es ab um den letzten Teil (_1_1) bei der Sortierung zu ignorieren und nur nach 000012 zu sortieren?

kann mir da jemand weiterhelfen? Wäre sehr dankbar face-smile

@echo off & setlocal
set "evenfolder=Gerade"
set "oddfolder=Ungerade"
for /f "delims=" %%i in ('dir /a-d /b 000*.*') do for /f "delims=rimg000." %%j in ("%%i") do for /f %%k in ('set /a "1%%j & 1"') do (
if %%k equ 0 (
move "%%i" "%evenfolder%\"
) else (
move "%%i" "%oddfolder%\"
)
)
PAUSE
Member: rubberman
rubberman Dec 06, 2019 at 18:19:23 (UTC)
Goto Top
Indem du delims an deine Gegebenheiten anpasst. Z.B. einen Unterstrich hinzufügen.

Steffen
Member: SabSch
SabSch Dec 09, 2019 at 14:41:55 (UTC)
Goto Top
Vielen Dank für deine rasche Antwort.
Leider bin ich vollkommen unerfahren damit, daher meine (blöde) Frage:
Wo/wie genau muss ich delims dafür anpassen?

LG
Member: rubberman
rubberman Dec 09, 2019 at 16:54:43 (UTC)
Goto Top
Vermutlich hier:
for /f "delims=" %%i in ('dir /a-d /b 000*.*') do for /f "delims=_." %%j in ("%%i") do for /f %%k in ('set /a "1%%j & 1"') do (  
Allerdings ist dein ...
Meine Bilder heißen zB 000012_1_1
etwas vage. Kommt noch irgendetwas davor (so wie in der ursprünglichen Frage des Threadstarters)? Davon dass die Dateien eine Dateiendung haben gehe ich auch mal aus ...

Steffen
Member: SabSch
SabSch Dec 10, 2019 at 07:13:04 (UTC)
Goto Top
Hat funktioniert.
Vielen, vielen Dank! face-smile