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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 352724
Url: https://administrator.de/forum/dateien-mit-zahlen-im-dateinamen-ungerade-oder-gerade-verschieben-352724.html
Ausgedruckt am: 20.04.2025 um 05:04 Uhr
15 Kommentare
Neuester Kommentar
Sollte möglich sein.
Lege das Batchscript in das Verzeichnis mit deinen Bildern.
Steffen
@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%\"
)
)
Steffen
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
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
- 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
- Der Rest ist Vergleichen und Verschieben.
Falls dir das bitweise UND irgendwie suspekt ist, erkläre ich es auch noch mal detaillierter ...
Steffen
Hallo Peter
Bitweise Operationen sind nicht auf Batch beschränkt
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
Die kleinste negative Zahl ist -2147483648
(binär
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:
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.
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?
Steffen
Bitweise Operationen sind nicht auf Batch beschränkt
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
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
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?
Steffen
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
@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
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
@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
Vermutlich hier:Allerdings ist dein ...
Steffen
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 (
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