Linux E X P R E S

Facebook

Mícháme pořadím souborů v Linuxu

Kopírujeme soubory do přehrávače ve správném fyzickém pořadí.


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í.

Diskuze (4) Nahoru