Come mescolare efficacemente un elenco di file con uno script bash
Presento un piccolo script bash per modificare l'ordine alfabetico di un elenco di file preassegnati, semplicemente aggiungendo un prefisso casuale e verificando che non corrisponda a caratteri già estratti. L'ho scritto per mischiare un elenco di brani che di solito ascolto in macchina su un lettore che non possiede questa funzione, ma penso che potrebbe essere utile anche per la presentazione di una serie di immagini o video tramite penna USB. Inoltre questo script permette di cancellare il prefisso aggiunto e riportare quindi i file alla versione originale, utile per fare un altro mix.
Ho deciso di scriverlo perché ero stanco di sentire sulla mia vecchia autoradio le stesse canzoni commerciali, gag, battute e notizie delle stazioni radio, una noia infinita! Dal momento che la musica mi accompagna tutti i giorni mentre vado al lavoro, mi sono dotato di un trasmettitore FM (10€ circa) da abbinare al mio vetusto autoradio, ma qui il secondo inghippo: questo gadget economico ha sì un lettore MP3 tramite microSD, ma non aveva la modalità di riproduzione casuale!
E così mi toccava sentire ogni giorno lo stesso ordine dei brani, che strazio! Lo script mi ha permesso quindi di cambiare l'ordine alfabetico della mia musica che è formata da una serie di file MP3 costituiti dal nome dell'artista seguito dal titolo della canzone. Ho scelto bash come linguaggio di programmazione perché possiede un sacco di comandi già pronti all'uso.
Lo script
Il programmino rimuove gli spazi vuoti e i caratteri speciali (', " e -) dai file e poi li mescola con l'aggiunta di un numero casuale o una lettera seguita da un carattere underscore. Per evitare problemi di compatibilità ho scelto di mettere solo le lettere minuscole dell'alfabeto inglese e i primi 10 numeri, usando questo comando:
cat /dev/urandom | tr -cd 'a-z0-9' | head -c 1
Logicamente questa funzione casuale non impedisce che le canzoni dello stesso artista abbiano un prefisso diverso, quindi lo script adotta un piccolo trucco:
- il carattere estratto viene immagazzinato in un array;
- si verifica che non sia già presente in esso, altrimenti se ne sceglie un altro[fn]Ho preso spunto da una discussione su stackoverflow: Check if an array contains a value[/fn].
Prerequisiti
Basta bash con: cat, sed e mv
Utilizzo
Per prima cosa si controlla la sezione SETTINGS dello script e si modifica se necessario:
# SETTINGS: EXTENSION_IN="mp3" # extension of the files to randomize DEBUG=true # if true, print statement after executing the command iterations=36 # because the maximum number of iterations (a-z0-9) can only be set to 36
In questo caso i file da rinominare sono gli MP3, il debug è impostato su true e l'array ha dimensione 36 (la massima consentita).
Una volta sistemato, funziona in questo modo:
./random.sh -shuffle directory --> to add a random prefix to a directory of mp3 ./random.sh -clean directory --> to remove the prefix to a directory of mp3
NOTA: la cartella è facoltativa e si può omettere se si esegue lo script nella stessa directory.
Download
Lo si può scaricare da qui:
- su GitHub: ..bash-scripts/shuffle_files_into_a_folder..
Esempio
Se per esempio si ha una cartella chiamata Example e che contiene questi file:
$ ls -a Example/ . artist4_elcjbvag.mp3 artist6_mrvtwcsi.mp3 .. artist4_oibiyhoi.mp3 artist6_xdsdgofn.mp3 artist1_qgqdpehr.mp3 artist5_bwycnlex.mp3 artist7_veayccrr.mp3 artist1_sxkldydj.mp3 artist5_ucmgmrvq.mp3 artist8_mgsrktrv.mp3 artist2_glbigbbm.mp3 artist5_udwsekqh.mp3 artist9_kplilabh.mp3 artist3_eedwekko.mp3 artist5_zvyuurby.mp3 artist9_wzwyyzln.mp3 artist3_qucbulng.mp3 artist6_agwbhlfs.mp3 artist3_vwoyruoh.mp3 artist6_hzeqcyin.mp3
Si possono mischiare con il comando:
./random.sh -shuffle Example
E ottenere:
$ ls -a Example/ . d_artist1_qgqdpehr.mp3 r_artist6_agwbhlfs.mp3 .. i_artist5_zvyuurby.mp3 t_artist5_bwycnlex.mp3 1_artist1_sxkldydj.mp3 j_artist8_mgsrktrv.mp3 u_artist6_hzeqcyin.mp3 3_artist9_wzwyyzln.mp3 k_artist5_ucmgmrvq.mp3 x_artist2_glbigbbm.mp3 5_artist4_oibiyhoi.mp3 l_artist3_qucbulng.mp3 y_artist9_kplilabh.mp3 7_artist3_vwoyruoh.mp3 m_artist5_udwsekqh.mp3 z_artist3_eedwekko.mp3 8_artist4_elcjbvag.mp3 n_artist6_mrvtwcsi.mp3 9_artist6_xdsdgofn.mp3 o_artist7_veayccrr.mp3
Se il debug è attivo, il messaggio di output potrebbe essere il seguente:
-------------------- The random letter or number is 'm' -------------------- The processed file is the number: 14 The array contains 13 element/s The new random element is 'm' This element is already in the array. The new random one is now '7' This element is already in the array. The new random one is now 'u' The array now contains 14 element/s: d 1 x z l 7 8 5 t k m i r u Original file: artist6_hzeqcyin.mp3 After: u_artist6_hzeqcyin.mp3 Rename file: mv artist6_hzeqcyin.mp3 u_artist6_hzeqcyin.mp3
E così via! È possibile poi ripulire la cartella con il seguente comando:
./random.sh -clean Example
Et voilà, le jeux sont fait:
$ ls -a Example/ . artist4_elcjbvag.mp3 artist6_mrvtwcsi.mp3 .. artist4_oibiyhoi.mp3 artist6_xdsdgofn.mp3 artist1_qgqdpehr.mp3 artist5_bwycnlex.mp3 artist7_veayccrr.mp3 artist1_sxkldydj.mp3 artist5_ucmgmrvq.mp3 artist8_mgsrktrv.mp3 artist2_glbigbbm.mp3 artist5_udwsekqh.mp3 artist9_kplilabh.mp3 artist3_eedwekko.mp3 artist5_zvyuurby.mp3 artist9_wzwyyzln.mp3 artist3_qucbulng.mp3 artist6_agwbhlfs.mp3 artist3_vwoyruoh.mp3 artist6_hzeqcyin.mp3
Add new comment