View Full Version : [bash] script per riniminare file con nomi casuali
Ho un lettore mp3 subacqueo che uso in piscina.
La modalità di riproduzione, però, è solo sequenziale, per cui alal lunga ascolto sempre la stessa lista.
M piacerebbe fare uno script che, lanciato, prenda i file della cartella e li rinomini a caso, lasciando solo inalterata l'estensione.
Qualcuno sa darmi un aiuto su dove trovare informazioni, o una base da cui partire? Purtroppo non mi sono mai cimentato nella programmazione..
john_revelator
01-10-2009, 15:09
Fammi capire, i file vengono riprodotti seguendo l'ordine del nome dei file?
Se è così basta che li ordini in maniera casuale e poi assegni loro un numero progressivo.
Non conosco la programmazione bash però ti posso suggerire una soluzione sotto windows tramite powershell.
Dettagli circa l'installazione di questo tool li trovi qui
http://www.hwupgrade.it/forum/showthread.php?t=1987466&highlight=powershell
e una volta scaricato il sw standalone powershell analyzer usi questo script dopo aver raggiunto la cartella che ti interessa col comando cd come col classico prompt dei comandi (attenzione che per salire di livello il comando è cd .. con uno spazio dopo cd).
function out-random {
$random = New-Object random
$input | sort {$random.next()}
}
$i = 1;
gci | out-random | % {rename-Item $_.name -newname ([string]$i+"_"+$_.name) -whatif;
$i++;
}
Lo switch -whatif ti avvisa dell'operazione di rinomina che verrebbe eseguita. Nel caso sia filato tutto liscio rimuovi tale switch e rilancia il comando. :)
edit. Ah, non avevo pensato al padding.
function out-random {
$random = New-Object random
$input | sort {$random.next()}
}
$i = 1;
gci | out-random | % {rename-Item $_.name -newname ("{0:D3}" -f $i+"_"+$_.name) -whatif;
$i++;
}
in questo modo anziche
1_nomefile, 2_nomefile ecc., avrai 001,002 e così via al fine dell'ordinamento.
[/code]
potresti anche lasciare inalterato tutto il nome...e modificare un prefisso iniziale:
for file in `ls *.mp3`;do mv "$file" "$RANDOM"_"$file";done
oppure fai solo una cp in una cartella diversa, almeno la puoi generare altri file partendo da quelli originali.
così te li ordina per il numero RANDOM generato
-------------------------------------
se invece ti basta l'estensione...
for file in `ls *.mp3`;do mv "$file" "$RANDOM".mp3;done
così puoi rilanciarlo tutte le volte e ogni volta ti rinomina i files ;)
anche se chiaramente consiglio vivamente di tenere il nome del file e aggiungere solo il prefisso iniziale...
dato che è tecnicamente possibile che il RANDOM ti generi sempre lo stesso numero :)
CUT
seppur tecnicamente perfetta come sempre la tua soluzione...
mi permetto di "PUNTUALIZZARE" che mi pare una perdita di tempo fare tutta una funzione per sortare in ordine random per poi dare numeri ordinati :)
quando anche con il banalissimo dos hai la variabile %RANDOM% :):)
PS: tanto lo so che non te la prendi se ti correggo :D:D:D
grazie mille ragazzi!! :D
Effettivamente avevo anche ventilato la possibilità di aggiungere solo un prefisso al nome file.
A questo punto dopo cena mi metto e provo la soluzione proposta, e vediamo se riesco a cambiare un po' l'ordine d'ascolto.
john_revelator
01-10-2009, 19:17
seppur tecnicamente perfetta come sempre la tua soluzione...
mi permetto di "PUNTUALIZZARE" che mi pare una perdita di tempo fare tutta una funzione per sortare in ordine random per poi dare numeri ordinati :)
quando anche con il banalissimo dos hai la variabile %RANDOM% :):)
PS: tanto lo so che non te la prendi se ti correggo :D:D:D
Ciao zuper. Ma figurati, ci mancherebbe. Non me la prendo di certo, anzi è sempre un piacere confrontarsi con altre persone e imparare da ognuno. Il fatto è che ormai sono powershell's addicted. :D
@laba: facci sapere come risolvi. :)
mi piace aver suscitato un sano confronto... :)
ho creato lo script (aggiungendo #!bin/bash come prima riga ovviamente) e dando il permesso di esecuzione.
Ecco però l'output:
mv: impossibile eseguire stat di "/media/dati-sda/MUSICA/script/Sunday": Nessun file o directory
sono un po' troppo stanco per mettermi a capire qualcosa stasera: dormito troppo poco! Vi faccio sapere se riesco a capire da solo dove sta l'inghippo, sicuramente è una stupidaggine
p.s.:Nel frattempo, sapreste indicarmi qualche buona risorsa su cui iniziare a farmi un po' e ossa con la programmazione shell? Linux Magazine aveva una sezione dedicata, ma io dovrei partire proprio da zero zero
1) ma nello script hai aggiunto un cd per andare nella cartella dove sta la musica?
2) ci sono effettivamente file mp3?
Il fatto è che ormai sono powershell's addicted. :D
lo so...dovresti andare in una clinica per disintossicarti :D
1) ma nello script hai aggiunto un cd per andare nella cartella dove sta la musica?
2) ci sono effettivamente file mp3?
1) lo script lo lancio nella cartella stessa in cui ci sono i file
2) si, ci sono gli mp3 :)
ho svelato l'arcano: così com'è lo script si inchioda se incontra nomi di file con gli spazi. Togliendoli o semplicemente sostituendoli son underscore tutto funziona a meraviglia, ecco ad esempio cosa mi ha generato:
9321_13968_3491_benharper-stealmy_kisses.mp3
32498_4301_21617_Blur-CountryHouse.mp3
mi sa che ne approfitto per far togliere gli spazi a tutti gli mp3 che ho, ricordo in passato di aver usato un tool del genere, devo solo ricordarmi quale fosse. Ma google aiuta sempre!
1) lo script lo lancio nella cartella stessa in cui ci sono i file
2) si, ci sono gli mp3 :)
ho svelato l'arcano: così com'è lo script si inchioda se incontra nomi di file con gli spazi. Togliendoli o semplicemente sostituendoli son underscore tutto funziona a meraviglia, ecco ad esempio cosa mi ha generato:
9321_13968_3491_benharper-stealmy_kisses.mp3
32498_4301_21617_Blur-CountryHouse.mp3
mi sa che ne approfitto per far togliere gli spazi a tutti gli mp3 che ho, ricordo in passato di aver usato un tool del genere, devo solo ricordarmi quale fosse. Ma google aiuta sempre!
sorry nn mi era neanche venuto in mente che uno su *nix potesse avere nomi file con gli spaziiiiiiiiiiiiiiii
:doh: :doh: :doh:
:banned: :banned: :banned:
hai ragione, anche io sono contro gli spazi nei nomi file..però erano tutte canzoni già codificate così.
Poco male, ho girato un po' e ho trovato questo script, lo posto così se a qualcuno serve lo può usare:
#!/bin/bash
#script che trasforma gli spazi nei file in underscore(_)
#Riesce a rinominare anche cartelle e sottocartelle
#Lascia invariate Maiuscole e minuscole
#se si vogliono cambiare maiuscole in minuscole basta cambiare
#tr 'A-Z ' 'A-Z_'` in tr 'A-Z ' 'a-z_'`
#Autore Lucio Zara (nick pennega)
#Sito www.spaghettilinux.org
#Mail pennega@gmail.com
#Versione 0.5
#Licenza GPL
#funzione usata per rinominare i file
RENAMEFILE() {
#$FILE non è necessario definirla come locale
local FILE=$1 #$1 è la 1° variabile passata alla funzione al momento della sua invocazione
#se non ho spazi nel nome file non lo devo rinominare
if echo $FILE | grep " " ; then
NEWNAMEFILE=`echo $FILE | tr 'A-Z ' 'A-Z_'`
#rinomino il file $NEWNAMEFILE contiene il nome del file
#con gli spazi traformati in _
mv "$FILE" $NEWNAMEFILE
fi
}
#questa è una funzione ricorsiva
RENAMEDIR() {
#$DIR è necessario definirla come locale
local DIR=$1
if echo $DIR | grep " " ; then
NEWNAMEDIR=`echo $DIR | tr 'A-Z ' 'A-Z_'`
mv "$DIR" $NEWNAMEDIR
else
#se non ci sono spazi assegno a $NEWNAMEDIR il valor di $DIR
NEWNAMEDIR=$DIR
fi
#Entro nella dir per verificare se ho altre dir o file
cd $NEWNAMEDIR
find -maxdepth 1 | while read d; do
#il comando find mi restituisce tra i risultati anche la dir corrente ./
#che non và considerata
if [ "$d" != "." ]; then
#verifico se $d è una directory
if [ -d "$d" ]; then
#se $d è una directory richiamo la funzione ricorsivamente
RENAMEDIR "$d"
else
#se $d non è una directory richiamo la funzione RENAMEFILE
RENAMEFILE "$d"
fi
fi
done
#Visto che prima sono entrato in $NEWNAMEDIR
adesso devo uscirne per poter continuare
cd ..
}
#MAIN
find -maxdepth 1 | while read l; do
#il comando find mi restituisce tra i risultati anche la dir corrente ./
#che non va considerata
if [ "$l" != "." ]; then
#verifico se ho una directory
if [ -d "$l" ]; then
#richiamo la funzione RENAMEDIR
RENAMEDIR "$l"
else
#richiamo la funzione RENAMEFILE
RENAMEFILE "$l"
fi
fi
done
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.