【发布时间】:2011-03-11 15:47:28
【问题描述】:
我有一部“智能”手机,它似乎没有音乐随机播放功能,所以最好的办法是编写一个 bash 脚本,在当前目录中的所有文件名前面加上一个随机数。
这很难吗?
【问题讨论】:
-
可能想先通过
`printf %05d $RANDOM`-"$i"运行以下建议
我有一部“智能”手机,它似乎没有音乐随机播放功能,所以最好的办法是编写一个 bash 脚本,在当前目录中的所有文件名前面加上一个随机数。
这很难吗?
【问题讨论】:
`printf %05d $RANDOM`-"$i" 运行以下建议
我知道这已经很老了,但我刚刚遇到了类似的问题,也许这仍然有用。我刚买了一个便宜但防水的 MP3 播放器来跑步,它运行良好,只是在随机播放模式下,同样的几首歌似乎一直在重复。我在LinuxQuestions.org 上找到了一些说明,我可以根据自己的需要进行修改,所以这是我经过反复试验后得出的结论:
我创建了一个名为 Running 的文件夹,并将我正在运行的播放列表中的所有 MP3 放在那里。 (我将文件夹名称大写,以免意外删除。)
#!/bin/bash
mkdir ../running_random
for fname in *.mp3
do
cp "$fname" ../running_random/$RANDOM."$fname".mp3
done
我从 Running 目录中调用脚本,将新创建的 running_random 目录中的内容复制到我的 MP3 播放器,然后删除 running_random。
【讨论】:
这是我博客中将在 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
【讨论】:
通过这个外壳,您的音乐库将随机播放,在播放完所有歌曲之前不会重复任何歌曲。 播放歌曲的历史记录在文件“.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
【讨论】:
如果文件已经被洗牌,这个脚本将洗牌并重新洗牌。如果你传递一个-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 版。
【讨论】:
不,这并不难做到。但是,它会弄乱您精心制作的文件名,并且可能难以撤消。
您可以使用$RANDOM 作为 bash 中随机数的简单来源。为您
案例:
#!/bin/bash
for file in *; do
mv "$file" $RANDOM-"$file"
done
我没有测试这个。您可能想自己在一些小的 示例以确保您知道它的作用。
【讨论】:
printf "%06d" $RANDOM 保持随机部分的长度不变。
并不难。比如:
for i in *; do mv "$i" $RANDOM-"$i"; done
【讨论】: