Salta al contenuto principale
Working from scratch, following simplicity

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.

How to shuffle slyly a list of file with a bash script

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:

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

Aggiungi un commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.

Plain text

  • Nessun tag HTML consentito.
  • Indirizzi web ed indirizzi e-mail diventano automaticamente dei link.
  • Linee e paragrafi vanno a capo automaticamente.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.

Aggiungi un commento

Il contenuto di questo campo è privato e non verrà mostrato pubblicamente.

Plain text

  • Nessun tag HTML consentito.
  • Indirizzi web ed indirizzi e-mail diventano automaticamente dei link.
  • Linee e paragrafi vanno a capo automaticamente.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
Sponsored Links
Pubblicità

Nicola Rainiero

Ingegnere civile specializzato in geotecnica con l'ambizione di facilitare la propria attività lavorativa usando e creando software libero per un sapere condiviso e collettivo. Mi occupo anche di energie rinnovabili ed in particolare di geotermia a bassa entalpia. Sono da sempre appassionato di web design e modellazione 3D.