Bash 如何随机选择一首好久没听过的歌曲并播放

Bash 如何随机选择一首好久没听过的歌曲并播放,bash,file,random,mp3,Bash,File,Random,Mp3,洗牌mp3文件通常会导致听到最近播放的曲目。因此,我决定使用“touch”命令来更新文件的“上次修改”日期和时间。我想让我的脚本从我最长时间没有听过的10首歌曲中随机选择一首 我想到了这个: ls -t $music_folder | tail -n 10 | sort -R | tail -n 1 | while read file; do echo $music_folder$file mplayer $music_folder$file done 我还没有添加“触摸”行来更新即将播放

洗牌mp3文件通常会导致听到最近播放的曲目。因此,我决定使用“touch”命令来更新文件的“上次修改”日期和时间。我想让我的脚本从我最长时间没有听过的10首歌曲中随机选择一首

我想到了这个:

ls -t $music_folder | tail -n 10 | sort -R | tail -n 1 | while read file; do
 echo $music_folder$file
 mplayer $music_folder$file
done
我还没有添加“触摸”行来更新即将播放的歌曲

这将列出$music_文件夹中按上次修改时间排序的文件,只查看最长时间内未被触碰的10个文件,随机化这10个文件的排序顺序,然后获取列表底部的文件

“回音”线路工作正常。但是,当我尝试使用mplayer播放歌曲时,它会尝试播放多个文件,其中结果的每个单词都是不同的文件名。为什么它不以单个文本字符串的形式传递$file?如何让mplayer播放回音线中显示的文件?

解决方案
在shell变量周围加上双引号。例如:

mplayer "$music_folder$file"
讨论 问题是bash和所有其他POSIX shell一样,对不带引号的shell变量执行路径名扩展和单词拆分。为了举例说明,让我们在一个包含三个文件的目录中工作:

$ ls
1.mp3  2.mp3  3.mp3
现在,让我们定义一个变量并展开它而不引用:

注意dir/Joe和song是分开的:这是分词。此外,*.mp3成为目录中的文件列表:这是路径名扩展。但是,使用双引号可以抑制这两种情况:

$ printf "%s\n" "$var"
dir/Joe's song *.mp3
这就是你想要的

完整性,让我们考虑单引号:

$ printf "%s\n" '$var'
$var

在单引号内,shell不展开任何内容。因此,如上所示,即使是四个字符$var也保持不变。

在外壳变量(如mplayer$music\u folder$file)周围加上双引号。除非您想要分词、路径名扩展、平铺扩展和大括号扩展,否则您应该始终在shell变量周围加上双引号。我真不敢相信我错过了这些!工作完美。谢谢你的帮助。
$ printf "%s\n" '$var'
$var