开发者

Bash script to prepend a random number to all files

I have a "smart" phone that doesn't seem to have a music shuffle function, so the next best thing is to write a bash script to prepend all 开发者_StackOverflowfilenames in the current directory with a random number.

Is this difficult to do?


No, this is not hard to do. It will however mess up your carefully crafted filenames, and might be hard to undo.

You can use $RANDOM as a simple source of random numbers in bash. For your case:

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

I didn't test this. You probably want to test this yourself on some small sample to make sure you know what it does.


This script will shuffle files and reshuffle them if they've already been shuffled. If you pass it an argument of -u it will unshuffle the files (remove the random prefix).

#!/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

It uses a fixed-width five digit random number after a "1" and followed by "9-" so the shuffled filenames are of the form: 1ddddd9-filename maybe with spaces - and other stuff.1983.mp3.

If you re-run the script, it will reshuffle the files by changing the random number in the prefix.

The -u argument will remove the 1ddddd9- prefix.

The script requires Bash >= version 3.2.


Not really difficult. Something like:

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


Here's a script that will run on OS X and linux from my 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


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

#!/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


I know this is pretty old, but I was just confronted with a similar problem, and maybe this'll still be useful. I just bought a cheap but waterproof MP3 player for running, which works fine except that in shuffling mode the same few songs seem to keep repeating. I found some instructions on LinuxQuestions.org that I could modify for my needs, so here's what I came up with after a little trial and error:

I created a folder called Running and put all my MP3s from my running playlist in there. (I capitalized the folder name so I don't accidentally delete it.)

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

I call the script from inside the Running directory, copy the contents from the newly created running_random directory to my MP3 player, then I delete running_random.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜