Můj MP3 přehravač Evolve je šikovný, umí přehrávat hudbu a dlouho vydrží. To je skvělé, nicméně podobně jako jiné kusy spotřební elektroniky má nějakou tu vadu. Neumí skladby v adresáři setřídit - vždy je přehrává „tak jak jsou“. Od takového zařízení obvykle očekáváme přehrávání skladeb v lexikografickém pořadí, já sám všechny skladby vždy pojmenovávám ve formátu 01-nazev.ogg (případně mp3). Jenže přehrávač to bere jakoby napřeskáčku – soubory totiž nejsou fyzicky na disku uloženy v setříděné formě.
Příkaz ls z balíku GNU Fileutils se chová standardně tak, že soubory setřídí. Ukážeme si to na příkladě – album od Anny K Best Of:
$ ls -1 01-Laska 2.0.mp3 02-Nebe.mp3 03-Nelitam nizko.mp3 04-Noc na zemi.mp3 05-Sesty smysl.mp3 06-Pohadka.mp3 07-O kousek vedle tebe.mp3 08-Chvili nad vodou.mp3 09-Spojeny kralovstvi smutku a radosti.mp3 10-Vecernice.mp3 11-Jedem krajinou.mp3 12-Vecirek za koncem.mp3 13-Snad.mp3 14-Zaviram oci.mp3 15-Staci, kdyz se divas.mp3 16-Setri s tim.mp3 17-Kousek myho ja.mp3 18-Vzacnej den.mp3 19-Laska.mp3 20-Shakey Ground (Bonus).mp3
Když toto album nahraju do přehrávače, nebude jej reprodukovat v tomto pořadí. Proč? Na disku jsou soubory uloženy nesetříděně. V mém případě je to takto:
$ ls -1U 07-O kousek vedle tebe.mp3 06-Pohadka.mp3 02-Nebe.mp3 17-Kousek myho ja.mp3 03-Nelitam nizko.mp3 08-Chvili nad vodou.mp3 11-Jedem krajinou.mp3 20-Shakey Ground (Bonus).mp3 15-Staci, kdyz se divas.mp3 13-Snad.mp3 19-Laska.mp3 04-Noc na zemi.mp3 18-Vzacnej den.mp3 09-Spojeny kralovstvi smutku a radosti.mp3 16-Setri s tim.mp3 14-Zaviram oci.mp3 01-Laska 2.0.mp3 10-Vecernice.mp3 12-Vecirek za koncem.mp3 05-Sesty smysl.mp3
Podobně bychom pochodili, kdybychom soubory vypsali příkazem find . -type f. Jak tedy docílíme toho, abychom je měli na přehrávači ve správném pořadí? Předně je třeba si uvědomit, že jde o fyzické uložení na disku (resp. ve stromu inodů), takže pouhé nastavení času souborů nám vůbec nepomůže:
IFS=$'\n'; for F in $(ls -1); do touch "$F"; done # tohle nedělejte - je to k ničemu
Je třeba soubory nekopírovat hvězdičkovou konvencí (přes zástupný/žolíkový znak), ani přes Midnight Commandera nebo Nautilus (či cokoli jiného). Je třeba vytvořit skript, který vytřídí soubory nejprve podle názvu a poté je bude jeden po druhém kopírovat na cílové médium. Skript, který jsem si vytvořil já je tento (pojmenoval jsem ho 2player.sh):
#!/bin/bash MEDIADIR=/media/30A3-239E IFS=$'\n' for DIR in $(ls -1); do if [ -d "$DIR" ]; then echo "Processing $DIR" mkdir -p "$MEDIADIR/$DIR" for FILE in $(ls -1 "$DIR"); do echo "Copying $DIR/$FILE" cp -n "$DIR/$FILE" "$MEDIADIR/$DIR" done fi done
Skript mám v prázdném adresáři, do kterého nejprve všechny soubory, které chci kopírovat do zařízení, nakopíruji. Obvykle provedu potřebné úpravy (zkrátím názvy, případně rekóduji do OGGu) a nakonec skript spustím. Ten soubory kopířuje adresář po adresáři, soubor po souboru. Vše má vždy setříděné dle názvu. Nakonec si můžete fyzické pořadí uložení souborů na cílovém svazku ověřit pomocí příkazu ls -1U.
Ačkoli nejsem zrovna posluchač popu, toho českého už vůbec ne, písničky od Anny K mám moc rád. Držím Lucce pěsti, ať se uzdraví.