Ściągając ostatnio najpierw płytę Beefy'ego - Tube Technology, a później MC Plus+'a - Chip Hop (polecam obie) zauważyłem nieprzyjemny nawyk autorów - piosenki są co prawda ponumerowane na stronie, ale po ściągnięciu ich np za pomocą dTa otrzymujemy mieszankę - numery tagów nie są wpisane w nazwę pliku. Jako iż zawsze słucham muzyki albumowo, taka sytuacja była dla mnie niedopuszczalna.
Postanowiłem zaprząc BASHa do pracy. Zacząłem od sprawdzenia zwrotu polecenia id3:
d4rky@colossus:~/mcplus+/chiphop$ id3 -l "MC Plus+ - Chip Hop - Still Hustlin'.mp3" MC Plus+ - Chip Hop - Still Hustlin'.mp3: Title : Still Hustlin' Artist: MC Plus+ Album : Chip Hop Year: 2006, Genre: Hip-Hop (7) Comment: http://www.mcplusplus.com/ Track: 1
Dooobra, ale chcemy tylko numer ścieżki. Wykorzystujemy więc potęgę AWKa i wyciągamy sam numer Tracka:
d4rky@colossus:~/mcplus+/chiphop$ id3 -l "MC Plus+ - Chip Hop - Still Hustlin'.mp3" | awk '/Track: /{print $4}' 1
Ładnie, ładnie. Teraz tylko przelecieć wszystkie pliki i podoklejać liczbę, prawda? Dla bezpieczeństwa chwilowo tylko wyświetlamy bez robienia zmian:
d4rky@colossus:~/mcplus+/chiphop$ for i in *.mp3; do echo "$(id3 -l "${i}" | awk '/Track: /{print $4}') ${i}"; done | sort -n 1 MC Plus+ - Chip Hop - Still Hustlin'.mp3 2 MC Plus+ - Chip Hop - Ascii Antics.mp3 (...) 16 MC Plus+ - Chip Hop - Man vs. Machine.mp3 17 MC Plus+ - Chip Hop - Shout Outs (Outro).mp3
Trochę nam się zamieszało - bierzemy po kolei wszystkie pliki mp3, sprawdzamy im tagi, wyciąŋamy numer ścieżki i na końcu doklejamy oryginalną nazwę pliku. Taaak, wszystko pięknie i ładnie, prawda?
W życiu ;) Niestety, uparłem się, że chcę piosenki w formacie Artysta - Ścieżka - Płyta - Nazwa. Uwielbiam sobie życie utrudniać ;) Trochę trzeba będzie przebudować całość:
d4rky@colossus:~/mcplus+/chiphop$ for i in *.mp3; do echo "${i}" | sed -e "s/-/- $(id3 -l "${i}" | awk '/Track: /{print $4}') -/"; done | sort -n MC Plus+ - 10 - Chip Hop - Syntax and Semantics.mp3 MC Plus+ - 11 - Chip Hop - The Empty Set.mp3 (...) MC Plus+ - 8 - Chip Hop - MySpace Pimpin'.mp3 MC Plus+ - 9 - Chip Hop - Code Rage.mp3
No.. prawie dobrze ;) Sed zmienia nam pierwszy minus na '- {polecenia wyciągania numeru} -'. Jedyne co nam zostało to te paskudne pojedyńcze liczby. Znacznie ładniej wyglądałoby gdyby przed pojedyńczymi liczbami znajdowało się zero, prawda? Cóż...
d4rky@colossus:~/mcplus+/chiphop$ for i in *.mp3; do echo "${i}" | sed -e "s/-/- $(id3 -l "${i}" | awk '/Track: /{print $4}' | sed -e "s/^\(.\)$/0\\1/") -/"; done | sort -n
Tak wygląda ostateczny kod. Jest to tzw. oneliner - skrypt w języku interpretowanym (skryptowym) zajmujący dokładnie jedną linijkę. Już wyjaśniam wszystkie fragmenty kodu.
for i in *.mp3;
Weź wszystkie pliki .mp3 z katalogu
do echo "${i}" \
Weź nazwę pliku...
| sed -e "s/-/- \
...przepuść przez seda, który zamieni myślnik na ...
$(id3 -l "${i}" |\
...wynik polecenia id3, które wyświetla listę tagów...
awk '/Track: /{print $4}' |\
...z których wyciągamy sam numer ścieżki...
sed -e "s/^\(.\)$/0\\1/") -/";
...i w przypadku pojedyńczej liczby dodajemy na początku zero.
done\
Kończmy pętlę.
| sort -n
Sortujemy, żeby ładnie wyglądało.
Ufff ;) To teraz tylko ostatecznie:
d4rky@colossus:~/mcplus+/chiphop$ for i in *.mp3; do mv "${i}" "$(echo "${i}" | sed -e "s/-/- $(id3 -l "${i}" | awk '/Track: /{print $4}' | sed -e "s/^\(.\)$/0\\1/") -/")"; done
I zrobione :) Podziękowania dla Nerdcore Hip-Hopu za inspirację i Michała Górnego za informację na temat konstrukcji ${zmienna}, $(polecenia) oraz podpowiedzi do seda.
Reklamy: sklep komputerowy ,
MiB – EasyTaga uzywam bardzo czesto do wielu rzeczy, ale chcialem sie troche pobawic konsola w ramach odstresowania ;)
Korzystając z offtopa – EasyTag nie obsługuje wysyłania do CDDB czy po prostu nie udało mi się tej funkcji znaleźć?
19-letni geek-webdesigner uczęszczający do ZSE w Bydgoszczy. więcej...
MiB
Witam!
O ile rozumiem wartość edukacyjną wpisu (dzięki za wyjaśnienie wszystkiego :) ), o tyle do zabaw w wypełnianie ID3 / zmianę nazw plików ja jednak polecam EasyTaga ;)
Pozdrawiam