Script/Batch um MP3 Dateien zu "mergen" gesucht

#884137
Lesenswert?

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
Gast #884282
Lesenswert?

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.
#885290
Lesenswert?

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?
#885444
Lesenswert?

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.
#886191
Lesenswert?

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 ;)
#886231
Lesenswert?

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
#886467
Lesenswert?

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
#886470
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren