shergotty
Goto Top

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

Content-Key: 120970

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

Printed on: April 26, 2024 at 23:04 o'clock

Member: rubberman
rubberman Jul 21, 2009 at 14:25:20 (UTC)
Goto Top
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?
Member: Shergotty
Shergotty Jul 21, 2009 at 14:36:25 (UTC)
Goto Top
Hallo erstmal,
xxx, yyy sind Bezeichnungen für den Inhalt der Podcasts.

Dateiname sieht z.B. so aus.

20060720 - SWR2 Wissen 20.07.2006- Das Ich und sein Gehirn.mp3


Aber gut, dass nachgefragt wird. Es kommt nicht darauf an, dass richtig eingeordnet wird. Ich möchte nur Abwechslung haben und möchte deshalb ein Podcast WDR-Stichtag, dann ein Podcast SWR-Wissen, ..
hören. Ich sortiere vorher in Ordner was ich hören möchte. Aus diesen beiden Ordnern soll jeweils eine Datei genommen werden und in ein neues Verzeichnis g:\01 kopiert werden. Dann die nächsten zwei Dateien, ..

Es genügt auch alles auf for /L %%i in (1 1 9) zu beschränken. Es müssen nicht alle Dateien aufgeteilt werden, sondern nur 9x je ein beliebiger Stichtag und daszu ein Podcast SWR Wissen.

Das Datum kann also unberücksichtigt bleiben.

Etwas klarer ?

Schon mal Danke !

Shergotty
Member: Shergotty
Shergotty Jul 21, 2009 at 14:40:31 (UTC)
Goto Top
Moment mal, vielleicht geht es auch viel einfacher !!!

Da es jeden Tag ein Stichtag und wochentags einen Podcast SWR-Wissen gibt, wäre die Lösung schon da, wenn nach dem Erstelldatum sortiert und kopiert wird. Dann gibt es immer abwechselnd einen Stichtag, dann wieder einen SWR-Podcast. Mehr möchte ich ja gar nicht.

Man benötigt also eine sortierte Liste der Dateien und kopiert diese dann in ein Zielordner. Ein einziger Zielordner sollte es auch schon tun.
Member: rubberman
rubberman Jul 21, 2009 at 17:07:55 (UTC)
Goto Top
Hallo Shergotty

Sry, für die Verspätung. Es gibt noch ein Leben neben dem PC... face-smile

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?
Member: Shergotty
Shergotty Jul 21, 2009 at 20:38:44 (UTC)
Goto Top
Ja, alles ist soweit richtig. Es gibt nur eine Datei pro Tag und die ersten Stellen sind schon eindeutig.

Vielleicht hilft es, wenn ich kurz schreibe, wie ich es mit UNIX machen würde.

Direktories auslesen und den Inhalt in jeweils eine Datei ausgeben. Dabei vor jede Zeile eine Zeilennummer schreiben. Dann die Dateien aneinanderhängen und diese Datei einlesen mit den Parametern Zeilennummer und Dateiname.

Es wäre auch kein Problem alle Dateien schon vorher umzubennenen oder in ein einziges Verzeichnis zu kopieren oder ...

vG
Shergotty
Member: rubberman
rubberman Jul 21, 2009 at 21:21:02 (UTC)
Goto Top
Versuchs mal so:
@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
Frage bitte, wenn dir was unklar ist.
Member: Shergotty
Shergotty Jul 22, 2009 at 06:57:14 (UTC)
Goto Top
Schon einmal vielen, vielen Dank. Ich komme heute Vormittag nicht mehr dazu es zu testen und es mir auch Schritt für Schritt zu verinnerlichen. Dabei werde ich wohl einiges dazulernen !!!

Ich melde mich dann später.
Member: rubberman
rubberman Jul 22, 2009 at 10:51:56 (UTC)
Goto Top
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.
@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
Member: Shergotty
Shergotty Jul 22, 2009 at 11:31:34 (UTC)
Goto Top
Danke !!!
Die Batchdatei wird durchlaufen, aber es passiert nichts, d.h. es werden keine Dateien kopiert.

Daraufhin habe ich zwischen 22 und 23: echo forward newname1=%newname1%
eingefügt.

Ausgabe: ca. 18 Zeilen mit
forward newname1=
Member: rubberman
rubberman Jul 22, 2009 at 12:02:52 (UTC)
Goto Top
Das sollte nicht das Problem gewesen sein. Wichtig ist, dass du die richtigen Werte in den Zeile 3-5 stehen hast. Dazu gehört auch, dass wenn dein mp3-Player als Laufwerk am PC gemappt ist, diesen Laufwerkbuchstaben im Pfad zu haben.
Member: Shergotty
Shergotty Jul 22, 2009 at 12:16:48 (UTC)
Goto Top
Um dies zu prüfen, habe ich nach :sub folgendes eingefügt:
echo sub %1 > ausgabe.txt

sub "2008-10-16 - SWR2 Wissen_ Wrde, Weisheit und Verfall.mp3"
sub "2008-10-24 - SWR2 Wissen_ Deutschland aus dem Hut erkl„rt.mp3"
sub "2008-10-28 - SWR2 Wissen_ Mexiko im Drogenkrieg.mp3"
sub "2008-11-06 - SWR2 Wissen_ Zwischen Etat und Eklat - Wohin steuert die Jugendarbeit_.mp3"
sub "2008-11-13 - SWR2 Wissen_ Saugute Geschichten.mp3"
sub "2008-12-05 - SWR 2 Wissen_Der Mensch und seine Rechte.mp3"
sub "2008-12-06 - SWR2 Wissen_ Aufbruch in die Praxis.mp3"
sub "2008-12-10 - SWR2 Wissen_ Der Zauber der Dreisatzrechnung.mp3"
sub "2008-12-20 - SWR2 Wissen_ Wie entsteht Musik im Kopf_.mp3"
sub "2009-01-17 - SWR2 Wissen_ Guckst Du hier Konkret.mp3"
sub "2009-02-06 - SWR2 Wissen_ Die Diktatur des Natrlichen.mp3"
sub "2009-02-21 - SWR2 Wissen_ Von Schulverweigerern zu Musterschlern.mp3"
sub "2009-04-11 - SWR2 Wissen_Das Zwei-Sprachen-Fieber.mp3"
sub "2009-04-15 - SWR2 Wissen_Allesk”nner unter Wasser.mp3"
sub "2009-04-27 - SWR2 Wissen_ Hubbles Universum.mp3"
sub "2009-05-11 - SWR2 Wissen_Wessis im Osten.mp3"
sub "2009-05-15 - SWR2 Wissen_Die Erfindung der Deutschen.mp3"
sub "2009-05-19 - SWR2 Wissen_ Auferstanden in den Schienen.mp3"

Es werden also die Dateien richtig gefunden. Die Namesumwandlung mit set verstehe ich leider nicht.
Kann es sein, dass keine Dateien kopiert werden, weil es sich um ältere Podcast und unterschiedliche Tage handelt?
Member: rubberman
rubberman Jul 22, 2009 at 12:46:21 (UTC)
Goto Top
Füge mal unter der Sprungmarke :forward die Zeile
echo %newname1%
ein, um zu sehen, ob die korrespondierende Datei gefunden wird.
Member: Shergotty
Shergotty Jul 22, 2009 at 13:09:48 (UTC)
Goto Top
Nein, hatte ich schon oben gemacht und beschrieben. Es wird nichts gefunden, weil ich mir nicht jeden Podcast SWR2Wissen anhören kann (ca. 30 Minuten lang). Deshalb sind dort nur ausgewählte Dateien im Ordner. Ich werde aber einmal korrespondierende Dateien in die Verzeichnisse kopieren und es testen.

Vielleicht wäre es einfacher wie folgt vorzugehen:

:: globale Variable
set z=1

for /f "tokens=*" %%i in ('dir /b *.mp3') do call main "%%i"

:main
mkdir g:\0%z%
xcopy /v /f %1 g:\0%z%
if z<10 set z=z+1

:: und dann die ersten 9 Dateien aus dem zweiten Verzeichnis
Member: Shergotty
Shergotty Jul 22, 2009 at 13:19:42 (UTC)
Goto Top
So, jetzt habe ich je 2 Dateien in den Ordnern:

2009-07-21 - WDR 2 Stichtag_ 21. Juli 1969_ Der erste Mensch betritt den Mond.mp3
2009-07-22 - WDR 2 Stichtag_ 22. Juli 1999_ China verbietet die Falun-Gong-Bewegung.mp3

2009-07-21 - Eroberung des Nutzlosen - Die erste Besteigung des Mount Everest ohne Sauerstoff.mp3
2009-07-22 - Krank im Knast.mp3

Jetzt sehe ich es auch !!! Das Dateiformat des Stichtags hat sich geändert, was oft vorkommt.
Deshalb wurden wieder keine Dateien kopiert.
Ich benenne die Stichtage einmal um.

... es geht !!!!
Member: rubberman
rubberman Jul 22, 2009 at 13:23:26 (UTC)
Goto Top
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. face-smile
Member: Shergotty
Shergotty Jul 22, 2009 at 13:30:14 (UTC)
Goto Top
Unsere Mitteilungen haben sich jetzt überschnitten.
Könntest Du das Datumsformat im Dateinamen noch ändern. Dann habe ich für die zukünftigen Podcasts eine brauchbare Batchdatei.

Wie groß wäre der Aufwand mit dem Zähler und beliebigen 9 Dateien in feste Verzeichnisse zu kopieren?
Pro Woche gibt es 7 Stichtage und 5 SWR2Wissen. So wäre ich etwas flexibler.

Auf jeden Fall hast Du mir sehr geholfen, da ich mich auch mit den Dingen befassen mußte und einiges verstanden habe.
Member: rubberman
rubberman Jul 22, 2009 at 13:53:28 (UTC)
Goto Top
Zum Datumsproblem: Schmeiß mal Zeile 16
set "fdate=%fdate:-=%"  
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 face-smile. 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 ...
Member: Shergotty
Shergotty Jul 22, 2009 at 14:07:53 (UTC)
Goto Top
Mit auskommentierter Zeile 16 passiert nichts mehr.

Ich dachte, dass man in einer Schleife die ersten n Dateien kopiert und die Schleife dann abbricht. Das gleiche noch einmal mit dem zweiten Verzeichnis und fertig.
Member: rubberman
rubberman Jul 22, 2009 at 14:25:05 (UTC)
Goto Top
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...
Member: Shergotty
Shergotty Jul 22, 2009 at 14:51:31 (UTC)
Goto Top
Natürlich kannst du die Schleife abbrechen. Aber ggf. werden
immer die gleichen n Dateien selektiert...

Was ich gehört habe, wird archiviert. Sonst würde ich schnell den Überblick verlieren.
Man könnte vielleicht noch ein paralleles Verzeichnis "Aktuell auf dem USB-Stick" anlegen, in das die Podcasts verschoben werden. Dann würde das Problem auch nicht mehr bestehen.
Member: rubberman
rubberman Jul 22, 2009 at 15:11:24 (UTC)
Goto Top
Na gut, das ganze also nochmal mit begrenzter Anzahl:
@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.
Member: Shergotty
Shergotty Jul 22, 2009 at 15:16:50 (UTC)
Goto Top
Schon mal ein großes Dankeschön.

Da ich einen Termin habe, kann ich mich erst morgen wieder melden. Bis dann !!!
Member: Shergotty
Shergotty Jul 23, 2009 at 09:28:08 (UTC)
Goto Top
Super !!!
Zeile 28 habe ich noch ein /a eingefügt und bin jetzt richtig zufrieden. Vielleicht setze ich mich noch hin und passe es noch ein wenig an. Auf jeden Fall habe ich eine prima Vorlage zum Einarbeiten.

Vielen, vielen Dank für Deine Mühe !!!
Member: rubberman
rubberman Jul 23, 2009 at 09:48:22 (UTC)
Goto Top
... stimmt, Option /a muss sein, habe ich vergessen. Sorry.

Gern geschehen.