2010-07-04 11 views
5

Ho un telefono "intelligente" che non sembra avere una funzione di musica shuffle, quindi la cosa migliore è scrivere uno script bash per anteporre tutti i nomi di file nell'attuale directory con un numero casuale.Script di Bash per anteporre un numero casuale a tutti i file

È questo difficile da fare?

+0

potrebbe voler eseguire i suggerimenti seguenti tramite '\' printf% 05d $ RANDOM \ '-" $ i "' primo –

risposta

5

No, questo non è difficile da fare. Tuttavia, rovinerà i nomi dei file accuratamente creati e potrebbe essere difficile da annullare.

È possibile utilizzare $RANDOM come una semplice fonte di numeri casuali in bash. Per il vostro caso:

#!/bin/bash 
for file in *; do 
    mv "$file" $RANDOM-"$file" 
done 

non ho la prova questo. Probabilmente vorrai testarlo tu stesso su qualche piccolo esemplare per assicurarti di sapere cosa fa.

+4

Inoltre, non eseguirlo più di una volta su un determinato set di file, o verrà anteporre un altro numero. Niente come avere "1413-426-234235-2-NeverGonnaGiveYouUp.mp3". – cHao

+0

@cHao: esattamente. L'intero approccio di spostare i file è rotto. Se potesse usare i softlink in qualche directory specifica e rimuoverlo una volta che ha finito. Non sono sicuro che il suo filesystem possa farlo. –

+0

Sfortunatamente, non ho accesso a cose come i link, dal momento che è solo un sistema FAT. Fortunatamente, i nomi dei file sono più o meno privi di significato poiché le cose importanti sono nei tag ID3. – Reinderien

3

Non proprio difficile. Qualcosa di simile:

for i in *; do mv "$i" $RANDOM-"$i"; done 
4

Questo script mescola i file e li rimescola se sono già stati mescolati. Se si passa un argomento di -u, i file verranno rimossi (rimuovere il prefisso casuale).

#!/bin/bash 
for file in *.mp3 
do 
    if [[ -d $file ]] 
    then 
     continue # skip directories 
    fi 
    if [[ $file =~ ^1[0-9]{5}9-(.*).mp3$ ]] # get basename 
    then 
     name=${BASH_REMATCH[1]}    # of a previously shuffled file 
    else 
     name=${file%.mp3}      # of an unshuffled file 
    fi 
    if [[ $1 != -u ]] 
    then 
     mv "$file" "1$(printf "%05d" $RANDOM)9-$name.mp3" # shuffle 
    else 
     if [[ ! -e "$file.mp3" ]] 
     then 
      mv "$file" "$name.mp3"       # unshuffle 
     fi 
    fi 
done 

Si utilizza un cinque cifre numero casuale larghezza fissa dopo un "1", seguita da "9-" quindi i nomi mescolate sono di forma: 1ddddd9-filename maybe with spaces - and other stuff.1983.mp3.

Se si esegue nuovamente lo script, i file verranno rimescolati modificando il numero casuale nel prefisso.

L'argomento -u rimuoverà il prefisso 1ddddd9-.

Lo script richiede Bash> = versione 3.2.

0

Attraverso questa shell, la libreria musicale verrà riprodotta in modo casuale, senza ripetere alcun brano fino a quando non tutti sono stati riprodotti. La cronologia dei brani riprodotti è registrata nel file ". Sh.his". Questa cronologia viene ripristinata automaticamente se hai aggiunto un brano alla libreria musicale o hai già ascoltato tutti i brani della tua libreria, generando un nuovo elenco casuale. Ogni volta che vuoi puoi resettare la cronologia cancellando il file ". Sh.his".

#!/bin/bash 

#-----------------------------------INFO---------------------------------------------------------- 

#Through this shell, your music library will be played randomly, without repeating any songs until all have been played. 
#The history of songs played is recorded in the file "*. Sh.his". 
#This history is reset automatically if you added a song to the music library or have already heard all the songs of your library, 
#generating a new random list ever. Whenever you want you can reset the history is deleting the file "*. Sh.his". 

#Press "q" to skip song 
#Press "p" to pause song and resume song 

#------------------------------CONFIGURATION------------------------------------------------------ 

#mplayer package needed (For debian/Ubuntu/Mint: "$ apt-get install mplayer") 

#Select your music library path (all recursive folders will be included in the .mp3 files search): 
path="/media/Datos/Música/Music/" 

#------------------------------------------------------------------------------------------------- 

while true 
do 

cadena=$(find "$path" -iname '*.mp3')         #search media files 
nmedia=$(echo "$cadena" | wc -l) 

if [ -f "$0.his" ]           #file exist 
then 
    value=$(<"$0.his")          #read file 

    if [[ ($(echo "$value" | sed -n 1p) != $nmedia) || ($(echo "$value" | sed -n 2p) == 0) ]] #reset file conditions 
    then 
     listrand=$(seq 1 $nmedia | shuf) 
     index=$nmedia 
    else            #no reset file conditions 
     nmedia=$(echo "$value" | sed -n 1p) 
     index=$(echo "$value" | sed -n 2p) 
     listrand=$(echo "$value" | sed -n 3p) 
     listrand=$(echo "$listrand" | sed s/" "/\\n/g) 
    fi 

else             #file not exist 
    listrand=$(seq 1 $nmedia | shuf) 
    index=$nmedia 
fi 

nrand=$(echo "$listrand" | sed -n "$index"p)        #select random number 
cadena=$(echo "$cadena" | sed -n "$nrand"p)        #select song with random number 
index=$((index-1))           #write file 
echo $nmedia > "$0.his" 
echo $index >> "$0.his" 
echo $listrand >> "$0.his" 
mplayer "$cadena"           #play media file 

done 
exit 0 
+0

Anche se questo è interessante, ha poco a che fare con la domanda: rinominare i file, non riprodurre musica. – Reinderien

1

Ecco uno script che verrà eseguito su OS X e Linux dal mio blog.

#!/bin/bash 
# 
# FILE: 
# prepend_random_num.sh 
# ABOUT: 
# Prepends a random number between 1-65000 and an underscore to all files of specified type 
# Runs on Mac OSX & Linux 
# EXAMPLE: 
# $ ls 
# a.jpg b.jpg 
# $ sh prepend_random_num.sh jpg 
# $ ls 
# 138_b.jpg 8474_a.jpg  

for file in *.$1 
do 
    rand=$(jot -r 1 1 65000 || shuf -i 1-65000 -n 1) 
    mv "$file" "$rand"_"$file" 
done 
0

So che questo è piuttosto vecchio, ma ero solo di fronte a un problema simile, e forse questo sarò ancora utile. Ho appena comprato un lettore MP3 economico ma impermeabile per funzionare, che funziona benissimo tranne che in modalità shuffling le stesse poche canzoni sembrano continuare a ripetersi. Ho trovato alcune istruzioni su LinuxQuestions.org che ho potuto modificare per le mie esigenze, quindi ecco cosa mi è venuto in mente dopo un po 'di tentativi ed errori:

Ho creato una cartella chiamata Corsa e metto tutti i miei MP3 dalla mia playlist in esecuzione. (Ho utilizzato il nome della cartella in maiuscolo per non eliminarlo accidentalmente.)

#!/bin/bash 
mkdir ../running_random 
for fname in *.mp3 
do 
     cp "$fname" ../running_random/$RANDOM."$fname".mp3 
done 

io chiamo lo script da dentro la directory Correre, copiare il contenuto della directory running_random appena creato per il mio lettore MP3, allora elimino running_random.

Problemi correlati