Okay - Musiksammlungen haben ja oft Leerzeichen im Namen, selten aber wohl Zeilenumbrüche.
Selten sollten auch Namenskollisionen sein, obwohl natürlich bei den Stones auf jeder 3. Scheibe Sympathy for the devil drauf ist (Live, Best of, ...) aber das sind dann keine CDs mit einem Stück - oder?
Also hier meine Teststruktur:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | ./musik
./musik/Frank Zappa
./musik/Frank Zappa/Sampler 1
./musik/Frank Zappa/Sampler 1/fz.mp3
./musik/Janis Joplin
./musik/Janis Joplin/Sampler 1
./musik/Janis Joplin/Sampler 1/jj.mp3
./musik/Allman Brothers
./musik/Allman Brothers/Sampler 1
./musik/Allman Brothers/Sampler 1/ab.mp3
./musik/Allman Brothers/Sampler 1/ab-intro.mp3
./musik/Deep Purple
./musik/Deep Purple/Sampler 1
./musik/Deep Purple/Sampler 1/dp-intro.mp3
./onemp3.sh
./vorher.lst
|
fz, jj usw. damit man später wiedererkennt, wo ein Irrläufer herkommt, und vorher.lst ist genau diese Liste, und onemp3.sh ist das Hexenwerk, zu dem wir jetzt kommmen:
| #!/bin/bash
#
(($(dir "$1"/*.mp3 | grep -c mp3) == 1)) && mv "$1"/*.mp3 "$1"/..
|
dir $1 ist das Verzeichnis, das der gleich vorzustellende find-Befehl findet, und da darin Leerzeichen erwartet werden maskiert.
dir "$1"/*.mp3 listet also die mp3-Files darin auf, leitet sie an grep, welches mit -c zählt wieviele Muster dort mp3 enthalten.
Der Sicherheit halber: Ein Technokünstler mit dem coolen Remix mp345mp345.mp3 wird hier als 3 Songs gezählt; wenn Du vor allem solche Titel in der Sammlung hast geh zum Arzt - da kann ich nicht mehr helfen. 😉
(( ... == 1 )) prüft schlicht, ob es genau eine solche Datei gibt, wenn ja wird der mv-Befehl ausgelöst: alle mp3s (nämlich das eine) wird einen Ordner hochgepusht.
Und hier der ominöse find-Befehl:
find musik -mindepth 2 -type d -exec ./onemp3.sh {} ";"
Man kann den Inhalt des Bash-Scriptes nicht einfach da einfügen, wo ./onemp3.sh steht, aus mehreren Gründen: a) Verwendet das Script eine Pipe, was find nicht derart für -exec-Befehle unterstützt. b) kann find nicht ((...)) && ..., und nicht $(( ... )) und überhaupt erschreckend wenig.
Achso - das Resultat:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | ./musik
./musik/Frank Zappa
./musik/Frank Zappa/fz.mp3
./musik/Frank Zappa/Sampler 1
./musik/Janis Joplin
./musik/Janis Joplin/jj.mp3
./musik/Janis Joplin/Sampler 1
./musik/Allman Brothers
./musik/Allman Brothers/Sampler 1
./musik/Allman Brothers/Sampler 1/ab.mp3
./musik/Allman Brothers/Sampler 1/ab-intro.mp3
./musik/Deep Purple
./musik/Deep Purple/dp-intro.mp3
./musik/Deep Purple/Sampler 1
./onemp3.sh
./vorher.lst
|
Als nächstes kann man dann die leeren Verzeichnisse noch mit
find musik -empty -delete
wegräumen.
Vorsicht! Die Reihenfolge von -empty und -delete ist entscheident. Führt man erst -delete aus ist hinterher alles empty!
Find ist generell sensibel für Schalterreihenfolgen - manchmal spielt es keine Rolle, und dann kann man fälschlich den Eindruck gewinnen, das wäre allgemein so; auch weil es allenthalben bei anderen Programmen so ist.