Dateien aus verschiedenen Ordnern zusammenstellen
Hallo zusammen,
bin noch ganz frisch hier und kenne mich besser mit UNIX-Shell aus, weshalb ich hier um kurze Hilfe und Unterstützung bitte.
Ich denke, dass mein Problem mit Batch-Programmierung zu lösen ist, anderenfalls bitte ich um Tipps für eine Scriptsprache, mit der ich das Problem lösen kann.
Hintergrund zum Problem:
Ich höre gerne Podcasts und möchte mir für jeden Tag einen neuen Ordner auf dem USB-Stick anlegen, der jeweils eine Datei aus verschiedenen Quellordnern enthält.
Das könnte ich von Hand machen, aber der mp3-Player sortiert (wie viele andere) falsch. Es wird das Erstelldatum verwendet, so dass ich mit xcopy Dateien aufspiele und nicht den Windows Explorer unter Windows XP verwenden kann.
Da die Podcasts sehr groß sein können und mein mp3-Player nach dem Ausschalten immer die letzte Datei von vorn beginnt, habe ich eine Möglichkeit gefunden die Dateien zu splitten. Dies soll mit in die Batchdatei einfließen. Dafür müssen die Leerzeichen und Punkte aus den Quelldateien entfernt werden.
Am besten ich erkläre das Problem an einem Beispiel (ohne Splitten):
Quellen:
.\Stichtag\20090719 WDR2 Stichtag xxx.mp3
.\Stichtag\20090720 WDR2 Stichtag yyy.mp3
.\Stichtag\20090721 WDR2 Stichtag zzz.mp3
.\SWR2Wissen\2009-07-19 SWR2 Wissen_xxx.mp3
.\SWR2Wissen\2009-07-20 SWR2 Wissen_yyy.mp3
.\SWR2Wissen\2009-07-21 SWR2 Wissen_zzz.mp3
Ziel (sortiert nach Erstelldatum)
g:\01\20090719WDR2Stichtagxxx.mp3
g:\01\2009-07-19SWR2Wissen_xxx.mp3
g:\02\20090720WDR2Stichtagyyy.mp3
g:\02\2009-07-20SWR2Wissen_yyy.mp3
g:\03\20090721WDR2Stichtagzzz.mp3
g:\03\2009-07-21SWR2Wissen_zzz.mp3
Die Zielverzeichnisse können 01, 02 .. heißen und auch die Namen der Zieldateien sind egal.
Mein Hauptproblem ist es, dass genau eine Datei aus jedem Quellordner genommen wird und in den Zielordner kopiert wird. Das bekomme ich irgendwie nicht hin.
Ich hoffe die Aufgabe ist klar geworden, ansonsten lieber kurz nachfragen, ich lese mit.
Ich brauche auch keine fertige Lösung, möchte ja selbst dazulernen, aber mir fehlen die Grundkenntnisse, um es in vernünftiger Zeit zu lösen.
Danke und vG
Shergotty
bin noch ganz frisch hier und kenne mich besser mit UNIX-Shell aus, weshalb ich hier um kurze Hilfe und Unterstützung bitte.
Ich denke, dass mein Problem mit Batch-Programmierung zu lösen ist, anderenfalls bitte ich um Tipps für eine Scriptsprache, mit der ich das Problem lösen kann.
Hintergrund zum Problem:
Ich höre gerne Podcasts und möchte mir für jeden Tag einen neuen Ordner auf dem USB-Stick anlegen, der jeweils eine Datei aus verschiedenen Quellordnern enthält.
Das könnte ich von Hand machen, aber der mp3-Player sortiert (wie viele andere) falsch. Es wird das Erstelldatum verwendet, so dass ich mit xcopy Dateien aufspiele und nicht den Windows Explorer unter Windows XP verwenden kann.
Da die Podcasts sehr groß sein können und mein mp3-Player nach dem Ausschalten immer die letzte Datei von vorn beginnt, habe ich eine Möglichkeit gefunden die Dateien zu splitten. Dies soll mit in die Batchdatei einfließen. Dafür müssen die Leerzeichen und Punkte aus den Quelldateien entfernt werden.
Am besten ich erkläre das Problem an einem Beispiel (ohne Splitten):
Quellen:
.\Stichtag\20090719 WDR2 Stichtag xxx.mp3
.\Stichtag\20090720 WDR2 Stichtag yyy.mp3
.\Stichtag\20090721 WDR2 Stichtag zzz.mp3
.\SWR2Wissen\2009-07-19 SWR2 Wissen_xxx.mp3
.\SWR2Wissen\2009-07-20 SWR2 Wissen_yyy.mp3
.\SWR2Wissen\2009-07-21 SWR2 Wissen_zzz.mp3
Ziel (sortiert nach Erstelldatum)
g:\01\20090719WDR2Stichtagxxx.mp3
g:\01\2009-07-19SWR2Wissen_xxx.mp3
g:\02\20090720WDR2Stichtagyyy.mp3
g:\02\2009-07-20SWR2Wissen_yyy.mp3
g:\03\20090721WDR2Stichtagzzz.mp3
g:\03\2009-07-21SWR2Wissen_zzz.mp3
Die Zielverzeichnisse können 01, 02 .. heißen und auch die Namen der Zieldateien sind egal.
Mein Hauptproblem ist es, dass genau eine Datei aus jedem Quellordner genommen wird und in den Zielordner kopiert wird. Das bekomme ich irgendwie nicht hin.
Ich hoffe die Aufgabe ist klar geworden, ansonsten lieber kurz nachfragen, ich lese mit.
Ich brauche auch keine fertige Lösung, möchte ja selbst dazulernen, aber mir fehlen die Grundkenntnisse, um es in vernünftiger Zeit zu lösen.
Danke und vG
Shergotty
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 120970
Url: https://administrator.de/forum/dateien-aus-verschiedenen-ordnern-zusammenstellen-120970.html
Ausgedruckt am: 06.04.2025 um 02:04 Uhr
24 Kommentare
Neuester Kommentar
Hallo Shergotty,
sicher lässt sich da was tun. Wenn ich es richtig verstanden habe, ist es immer das xxx, yyy, zzz ... im Dateinamen, nachdem sortiert und neu zugeordnet werden soll. Ich vermute, dass es sich hierbei um ein Datumsformat handelt und dass es in jedem Dateinamen gleich ist. Kannst du an einem Beispiel zeigen, wie das Format aussieht?
sicher lässt sich da was tun. Wenn ich es richtig verstanden habe, ist es immer das xxx, yyy, zzz ... im Dateinamen, nachdem sortiert und neu zugeordnet werden soll. Ich vermute, dass es sich hierbei um ein Datumsformat handelt und dass es in jedem Dateinamen gleich ist. Kannst du an einem Beispiel zeigen, wie das Format aussieht?
Hallo Shergotty
Sry, für die Verspätung. Es gibt noch ein Leben neben dem PC...
Also, gaaanz so einfach dürfte es auch nicht sein. Mit DIR /TC könnte man zwar das Erstellungsdatum herausbekommen, funktioniert aber nur auf NTFS-formatierten Datenträgern. Will heißen, auf deiner Festplatte sicherlich, aber der mp3-Player ist wahrscheinlich FAT-formatiert oder so.
Also werde ich mich heute abend auf die Dateinamen stürzen und mal versuchen das ganze auseinander zu nehmen.
Nur nochmal zur Sicherheit, bevor was schief geht:
- Es gibt 2 Rootverzeichnisse: .\Stichtag und .\SWR2Wissen
- In .\Stichtag fangen alle Dateinamen mit JJJJMMTT an, in .\SWR2Wissen mit JJJJ-MM-TT
Soweit richtig?
Gibt es mehrere Dateien pro Rootverzeichnis mit dem gleichen Datum am Anfang?
Sry, für die Verspätung. Es gibt noch ein Leben neben dem PC...
Also, gaaanz so einfach dürfte es auch nicht sein. Mit DIR /TC könnte man zwar das Erstellungsdatum herausbekommen, funktioniert aber nur auf NTFS-formatierten Datenträgern. Will heißen, auf deiner Festplatte sicherlich, aber der mp3-Player ist wahrscheinlich FAT-formatiert oder so.
Also werde ich mich heute abend auf die Dateinamen stürzen und mal versuchen das ganze auseinander zu nehmen.
Nur nochmal zur Sicherheit, bevor was schief geht:
- Es gibt 2 Rootverzeichnisse: .\Stichtag und .\SWR2Wissen
- In .\Stichtag fangen alle Dateinamen mit JJJJMMTT an, in .\SWR2Wissen mit JJJJ-MM-TT
Soweit richtig?
Gibt es mehrere Dateien pro Rootverzeichnis mit dem gleichen Datum am Anfang?
Versuchs mal so:
Frage bitte, wenn dir was unklar ist.
@echo off &setlocal enabledelayedexpansion
:: Quellen und Ziel:
set source1=F:\Stichtag
set source2=F:\SWR2Wissen
set targetdir=G:
pushd "%source2%"
for /f "tokens=*" %%i in ('dir /b *.mp3') do set "name2=%%i" &call :sub "%%i"
popd
pause
goto :eof
:sub
set "newname1="
set "fdate=%name2:~0,10%"
set "fdate=%fdate:-=%"
set "newname2=%~n1"
set "newname2=%newname2: =%"
set "newname2=%newname2:.=%.mp3"
pushd "%source1%"
for /f "tokens=*" %%j in ('dir /b *.mp3^|findstr /b %fdate%') do set "name1=%%j" &set "newname1=%%~nj" &goto forward
:forward
popd
if defined newname1 (
set "newname1=!newname1: =!"
set "newname1=!newname1:.=!.mp3"
set /a x+=1
set "foldernum=000000!x!"
set "foldernum=!foldernum:~-7!"
md !targetdir!\!foldernum!
copy "!source1!\!name1!" "!targetdir!\!foldernum!\!newname1!"
copy "!source2!\!name2!" "!targetdir!\!foldernum!\!newname2!"
)
goto :eof
Hallo Shergotty,
melde mich noch mal, weil mir eine Sache eingefallen ist die ggf. zu Problemen führen kann. Der bisherige Code erstellt neue Verzeichnisse, indem einfach bei 1 angefangen wird aufwärts zu zählen. Das passiert aber bei jedem Neustart des Batch. Ggf. werden also in das Verzeichnis 0000001 noch einmal andere Dateien kopiert usw. Habe den Code noch einmal abgeändert, sodass die Verzeichnissnamen im Format JJJJMMTT angelegt werden. Damit sollte dieser Fehler entfallen.
melde mich noch mal, weil mir eine Sache eingefallen ist die ggf. zu Problemen führen kann. Der bisherige Code erstellt neue Verzeichnisse, indem einfach bei 1 angefangen wird aufwärts zu zählen. Das passiert aber bei jedem Neustart des Batch. Ggf. werden also in das Verzeichnis 0000001 noch einmal andere Dateien kopiert usw. Habe den Code noch einmal abgeändert, sodass die Verzeichnissnamen im Format JJJJMMTT angelegt werden. Damit sollte dieser Fehler entfallen.
@echo off &setlocal enabledelayedexpansion
:: Quellen und Ziel:
set source1=F:\Stichtag
set source2=F:\SWR2Wissen
set targetdir=G:
pushd "%source2%"
for /f "tokens=*" %%i in ('dir /b *.mp3') do set "name2=%%i" &call :sub "%%i"
popd
pause
goto :eof
:sub
set "newname1="
set "fdate=%name2:~0,10%"
set "fdate=%fdate:-=%"
set "newname2=%~n1"
set "newname2=%newname2: =%"
set "newname2=%newname2:.=%.mp3"
pushd "%source1%"
for /f "tokens=*" %%j in ('dir /b *.mp3^|findstr /b %fdate%') do set "name1=%%j" &set "newname1=%%~nj" &goto forward
:forward
popd
if defined newname1 (
set "newname1=!newname1: =!"
set "newname1=!newname1:.=!.mp3"
md !targetdir!\!fdate!
copy "!source1!\!name1!" "!targetdir!\!fdate!\!newname1!"
copy "!source2!\!name2!" "!targetdir!\!fdate!\!newname2!"
)
goto :eof
Würde sicher gehen, aber die kopierten Dateien passen dann nicht zusammen. Ich bin so vorgegangen, dass für die Datei die mit
2008-10-16
beginnt, die entsprechende Datei die mit
20081016
beginnt, gesucht wird und beide in das Verzeichnis
20081016
kopiert werden.
So hatte ich das was du vorhast verstanden.
Edit:
... war noch für deinen vorhergenden Post.
Schön wenns funktioniert.
2008-10-16
beginnt, die entsprechende Datei die mit
20081016
beginnt, gesucht wird und beide in das Verzeichnis
20081016
kopiert werden.
So hatte ich das was du vorhast verstanden.
Edit:
... war noch für deinen vorhergenden Post.
Schön wenns funktioniert.
Zum Datumsproblem: Schmeiß mal Zeile 16
raus, und schau mal was passiert. In dieser Zeile wird aus JJJJ-MM-TT die Zeichenfolge JJJJMMTT. Da aber jetzt beide Dateien das gleiche Format am Anfang haben, kann/sollte auch direkt mit der ursprünglichen Zeichenfolge verglichen werden.
Die Sache zufällig was auszuwählen scheitert an der Tatsache, dass der Rechner nur rechnen und nicht raten kann
. Das heist, in irgendeiner Sortierung werden die Dateinamen immer ausgegeben werden. Man könnte mit der Umgebungsvariablen %random% was basteln. %random% nimmt einen Wert zwischen 0 und 32767 an. Um damit arbeiten zu können müsste man als erstes die Anzahl der Dateien in einem Verzeichnis feststellen, dann den Randomwert so umrechenen, dass er einen Wert zwischen 1 und Anzahl Dateien ergibt, dann für jeden Schleifendurchlauf einen Zähler mitlaufen lassen und wenn Zählerwert = Zufallswert, dann die gefundene Datei nehmen, die korrespondierende Datei suchen und beide kopieren ...
set "fdate=%fdate:-=%"
Die Sache zufällig was auszuwählen scheitert an der Tatsache, dass der Rechner nur rechnen und nicht raten kann
Hmm, deinem Post von 15:19:42 Uhr zufolge sind die Anfänge der Dateien
2009-07-21 - WDR 2 Stichtag_ 21. Juli 1969_ Der erste Mensch betritt den Mond.mp3
und
2009-07-21 - Eroberung des Nutzlosen - Die erste Besteigung des Mount Everest ohne Sauerstoff.mp3
beide im Format JJJJ-MM-TT
Sollte also funktionieren?!
______________________________
Natürlich kannst du die Schleife abbrechen. Aber ggf. werden immer die gleichen n Dateien selektiert...
2009-07-21 - WDR 2 Stichtag_ 21. Juli 1969_ Der erste Mensch betritt den Mond.mp3
und
2009-07-21 - Eroberung des Nutzlosen - Die erste Besteigung des Mount Everest ohne Sauerstoff.mp3
beide im Format JJJJ-MM-TT
Sollte also funktionieren?!
______________________________
Natürlich kannst du die Schleife abbrechen. Aber ggf. werden immer die gleichen n Dateien selektiert...
Na gut, das ganze also nochmal mit begrenzter Anzahl:
Edit: hatte doch glatt die Variablen verwechselt.
@echo off &setlocal enabledelayedexpansion
:: Quellen, Ziel und Anzahl:
set source1=F:\Stichtag
set source2=F:\SWR2Wissen
set targetdir=G:
set /a n=5
set /a x=1
pushd "%source2%"
for /f "tokens=*" %%i in ('dir /b *.mp3') do (if "!x!" gtr "!n!" goto ende) &set "name2=%%i" &call :sub "%%i"
popd
:ende
pause
goto :eof
:sub
set "newname1="
set "fdate=%name2:~0,10%"
set "fdate=%fdate:-=%"
set "newname2=%~n1"
set "newname2=%newname2: =%"
set "newname2=%newname2:.=%.mp3"
pushd "%source1%"
for /f "tokens=*" %%j in ('dir /b *.mp3^|findstr /b %fdate%') do set "name1=%%j" &set "newname1=%%~nj" &goto forward
:forward
popd
if defined newname1 (
set x+=1
set "newname1=!newname1: =!"
set "newname1=!newname1:.=!.mp3"
md !targetdir!\!fdate!
copy "!source1!\!name1!" "!targetdir!\!fdate!\!newname1!"
copy "!source2!\!name2!" "!targetdir!\!fdate!\!newname2!"
)
goto :eof
Edit: hatte doch glatt die Variablen verwechselt.