Hallo, da mein Autoradio leider nur 999 MP3 Tracks verwalten kann ist die Kapazizät von dem 8GB USB Stick natürlich nicht ausgenutzt. Ich hab mir nun überlegt, ein Skript zu schreiben, das die MP3 Liste auf den Stick durchsucht und jeweils 2 oder 3 Tracks per MP3merge zusammenkopiert und die Originaldateien dann auf dem Stick löscht. Mir ist klar, das damit die ID3 Tags "verloren gehen" aber das fände ich OK. Kennt da jemand was, oder kann mir jemand ein passende Skriptsprache empfehlen? Ich würde gerne was nehmen, was ohne installation läuft. Z.B. ne normale Batch Datei, Autohotkey, ... Werner
in der Art?
1 | find . -type f -name \*.mp3 -print0 | xargs -0 -n2 mp3merge.sh |
mit mp3merge.sh: Script-File das X files als Parameter nimmt, diese merged, und danach löscht?
Ja, sowas meine ich. Jetzt habe ich ja schon schön jeweils 2 Files pro Zeile. Prinzipiell kann man ja wohl auch per copy a+b c Befehl joinen, aber ich habe noch nicht verstanden, wie ich das zeilenweise innerhalb einer Batch auswerten kann.
Es gibt ein Programm zum aneinanderhängen von mp3-Dateien, das Programm heißt mp3Merge. Leider gibt es keine eigene Homepage für das Programm, so dass du es am besten mit einer Suchmaschine deiner Wahl suchen musst.
http://mp3wrap.sourceforge.net/ ? Wie das mit Windows geht, weiß ich nicht, mit bash wäre ein Vorschlag für Ernsts mp3merge.sh (ungetestet): #!/bin/bash if [ -f "$2" ]; then outfile="$(basename "$1" .mp3)"_and_"$(basename "$2")" mp3wrap "$outfile" "$1" "$2" rm "$1" "$2" fi
mp3wrap sieht super aus. Ich habe mir jetzt mal die Windowsversion der Bash gezogen. Leider bekomme ich nicht raus, wie ich die Parameterübergabe machen muss. Prinzipiell würde ich mir das so vorstellen
1 | find . -type f -name \*.mp3 -print0 | xargs -0 -n2 | bash mp3merge.sh |
Die gefundenen Dateien werden per Pipe an xargs übergeben, das übergibt per pipe die "sortierte liste" an das shell script. Leider geht das so nicht. Hat jemand erfahrung damit, wie man das macht?
warum lädst du dir nicht einfach das windoof-programm mp3merge herunter? simpler geht es doch wohl kaum, damit kann man auch mehr als nur zwei mp3s aneinanderhängen. hier mal ein link http://www.technikteam.de/software/download.php?id=637 (stand 03.06.2008)
@tom wenn ich Winmerge richtig verstanden habe, muss ich da die Dateien von Hand zusammenkopieren. Ich möchte von ca. 2000 Dateien jeweils 2 Stk. zusammen kopieren.
Werner A. wrote: > Prinzipiell würde ich mir das so vorstellen >
1 | find . -type f -name \*.mp3 -print0 | xargs -0 -n2 | bash mp3merge.sh |
> Die gefundenen Dateien werden per Pipe an xargs übergeben, das übergibt > per pipe die "sortierte liste" an das shell script. > Leider geht das so nicht. > Hat jemand erfahrung damit, wie man das macht? Das letzte "|" ist zuviel.
1 | xargs -0 -n2 bash mp3merge.sh |
macht folgendes: lies Nullterminierte Strings von STDIN, und immer wenn zwei vorhanden sind, rufe das angegebene Programm mit diesen strings als Parameter auf. D.H. zusammen mit dem find werden folgende Kommandos ausgeführt:
1 | bash mp3merge.sh file1.mp3 file2.mp3 |
2 | bash mp3merge.sh file3.mp3 file4.mp3 |
3 | ... |
4 | usw... |
5 | ... |
Wenns ne ungerade Anzahl Files war, wird das Script ein letztes Mal mit nur einem File aufgerufen. Macht aber nix, das Beispiel von Matt überprüft das, und lässt das File in Frieden.
Tja, jetzt muss ich nur noch die Leerzeichen in den Dateinamen in den Griff bekomme. Leider trennt das Leerzeichen ja $1 und $2 ...
Sollte eigentlich nicht sein. find mit "-print0" und xargs mit "-0" tauschen die Dateinamen extra über Nullterminierte Strings aus, damit eben keine Sonderzeichen/Leerzeichen Probleme machen. Sogar Newlines und Tabs im Filenamen kommen da unbeschadet durch. Kann dann eigentlich nur am merge-script liegen. Das Beispiel weiter oben packt $1 und $2 allerdings immer in Quotes ("$1" "$2"). Poste doch mal dein Script hier. Ach ja, rm "$1" "$2" schreibt man besser als rm -- "$1" "$2", nicht dass jemand eine Datei mit Namen "-rf" anlegt ;)
Tja, sollte... Der Aufruf auf der Kommandozeile sieht so aus:
1 | find . -type f -name \*.mp3 -print0 | xargs -0 -n2 bash mp3merge.sh |
Das Script hab ich nen bischen abgeändert um nen paar ausgaben zu haben.
1 | echo File1: "$1" |
2 | echo File2: "$2" |
3 | |
4 | if [ $# -gt 1 ]; then |
5 | outfile="$(basename "$1" .mp3)"_and_"$(basename "$2")" |
6 | echo OutFile: $outfile |
7 | #mp3wrap.exe "$outfile" "$1" "$2" |
8 | #rm "$1" "$2" |
9 | fi |
Die Ausgabe sieht so aus:
1 | H:\>find . -type f -name \*.mp3 -print0 | xargs -0 -n2 bash mp3merge.sh |
2 | File1: ./0001-0500/Oh |
3 | File2: Freunde, |
4 | OutFile: Oh_and_Freunde, |
5 | File1: ./0001-0500/Suspicious |
6 | File2: Jazz.mp3 |
7 | OutFile: Suspicious_and_Jazz.mp3 |
Wenn ich das richtig verstanden habe macht die Option -print0 bzw. -0 den String Null-Terminiert. Nur leider werden bei dem Ergebnis keine Anführungszeichen drumherum gesetzt. Somit werden die Leerzeichen bei der Parameterübergabe an das BashScript leider als verschiedene Parameter erkannt. Wenn ich nur find und xargs aufrufe sieht das so aus:
1 | H:\>find . -type f -name \*.mp3 -print0 | xargs -0 -n2 |
2 | ./0001-0500/Oh Freunde, nicht diese T÷ne.mp3 ./0001-0500/Returning.mp3 |
3 | ./0001-0500/Suspicious Jazz.mp3 ./0001-0500/Einen Noch.mp3 |
Versuch mal die Zusatz-Bash einzusparen:
1 | chmod +x mp3merge.sh |
2 | find . -type f -name \*.mp3 -print0 | xargs -0 -n2 ./mp3merge.sh |
Vorher Zeile am Anfang von mp3merge.sh einfügen:
1 | #!bash
|
Bei mir funktioniert das übrigens korrekt (mit deinem mp3merge script):
1 | > ls |
2 | A B C.mp3 mp3merge.sh X Y Z.mp3 |
3 | |
4 | |
5 | > find . -type f -name \*.mp3 -print0 | xargs -0 -n2 bash mp3merge.sh |
6 | File1: ./X Y Z.mp3 |
7 | File2: ./A B C.mp3 |
8 | OutFile: X Y Z_and_A B C.mp3 |
9 | |
10 | > find . -type f -name \*.mp3 -print0 | xargs -0 -n2 ./mp3merge.sh |
11 | File1: ./X Y Z.mp3 |
12 | File2: ./A B C.mp3 |
13 | OutFile: X Y Z_and_A B C.mp3 |
Spasseshalber noch einen Satz von Dateinamen + Verzeichnissen mit Sonderzeichen, Leerzeichen etc angelegt:
1 | > find . -type f -name \*.mp3 -print0 | xargs -0 -n2 ./mp3merge.sh |
2 | File1: ./☮☯☂.mp3 |
3 | File2: ./2 2/Ernst.mp3 |
4 | OutFile: ☮☯☂_and_Ernst.mp3 |
5 | File1: ./2 2/鋼.mp3 |
6 | File2: ./2 2/☂.mp3 |
7 | OutFile: 鋼_and_☂.mp3 |
8 | File1: ./1 1/☢☣ ☭ ☮☯☂.mp3 |
9 | File2: ./1 1/☢☣☭☮☯☂.mp3 |
10 | OutFile: ☢☣ ☭ ☮☯☂_and_☢☣☭☮☯☂.mp3 |
11 | File1: ./X Y Z.mp3 |
12 | File2: ./A B C.mp3 |
13 | OutFile: X Y Z_and_A B C.mp3 |
Nachtrag: Es kann gut sein, dass die Windows-Bash die Parameter-Auflösung anders handhabt (handhaben muss)... Du hast die Files doch alle auf deinem USB-Stick, oder? Versuch einfach mal ein Linux von CD zu Booten, und probiers da aus. Evtl ist auch andLinux (http://www.andlinux.org/) besser als Cygwin geeignet, da es einen echten Linux-Kernel unter Windows bootet, sich aber trotzdem recht gut in das Windows drumherum integriert.
Stimmt, ich werde heute abend mal probieren, die bash vorher zu starten und die find/xargs Kommandozeile da zu starten. Wäre nochmal ne Idee. Es gibt ja auch noch verschiedenste Bash Versionen für Windows. Ich meld mich dann ;-)
Ok, ich hab 2 verschiedene Bash ausprobiert. Bei beiden geht das auch nicht. Ich hab mir gestern abend schonmal ein USB Linux (puppy) geladen, aber hat dann im X-Mode gestartet und ich konnte nicht rausfinden, wie ich mein USB Laufwerk mounten muss.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.