Bash脚本为所有文件添加一个随机数

时间:2010-07-04 16:07:42

标签: linux bash

我有一个似乎没有音乐随机播放功能的“智能”手机,所以接下来最好的方法是编写一个bash脚本,用随机数在当前目录中添加所有文件名。

这难吗?

6 个答案:

答案 0 :(得分:5)

不,这不难做到。但是它会弄乱您精心设计的文件名,并且可能很难撤消。

您可以在bash中使用$RANDOM作为随机数的简单来源。为您 情况下:

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

我没有测试过这个。你可能想在一些小的情况下自己测试一下 样品,以确保你知道它的作用。

答案 1 :(得分:4)

如果文件已被洗牌,此脚本将随机播放文件并重新洗牌。如果你传递一个-u的参数,它将取消文件的清洗(删除随机前缀)。

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

它在“1”之后使用固定宽度的五位随机数,然后是“9-”,因此混洗的文件名的格式为:1ddddd9-filename maybe with spaces - and other stuff.1983.mp3

如果您重新运行该脚本,它将通过更改前缀中的随机数来重新调整文件。

-u参数将删除1ddddd9-前缀。

该脚本需要Bash> =版本3.2。

答案 2 :(得分:3)

不是很难。类似的东西:

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

答案 3 :(得分:1)

这是一个将在我的博客上运行在OS X和Linux上的脚本。

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

答案 4 :(得分:0)

通过此shell,您的音乐库将随机播放,无需重复播放任何歌曲,直到所有歌曲播放完毕。 播放的歌曲的历史记录在文件“ .Sh.his”中。 如果您将某首歌曲添加到音乐库或已经听过您图书馆的所有歌曲,则会自动重置此历史记录,从而生成新的随机列表。您可以随时重置历史记录,删除文件“ .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

答案 5 :(得分:0)

我知道这已经很老了,但我遇到了类似的问题,也许这仍然有用。我刚买了一个便宜但防水的MP3播放器用于跑步,除了在洗牌模式下相同的几首歌似乎不断重复之外,它的工作正常。我在LinuxQuestions.org找到了一些我可以根据自己的需要修改的说明,所以这是我在经过一些试验和错误后想出的:

我创建了一个名为Running的文件夹,并将我运行的播放列表中的所有MP3放入其中。 (我将文件夹名称大写,所以我不小心删除它。)

for data in listdata { // listdata is (Database) has a variable (ans)

    let tar = data.ans.characters.map { String($0) }
    // Swift 4:  let tar = data.ans.map(String.init)

    lblLabel.text = tar.joined(separator: " ")

}

print(lblLabel.text ?? "")  // "A B C D"

我从Running目录中调用脚本,将新创建的running_random目录中的内容复制到我的MP3播放器,然后删除running_random。