在我的 .bashrc 中,我有一个用于播放随机视频的函数(下面没有写,仅供参考),另一个函数用于播放所有媒体文件,例如:
createmediafiles() {
find ~+ -type f -iregex '.*\.\(mp3\|wav\|ogg\|flac\|mp4\|mov\|avi\)' > ~/mediafiles.txt
find ~+ -type d -name VIDEO_TS >> ~+/mediafiles.txt
}
playmediafiles() {
while true; do
while read -r line; do
shuf -n 1 |
tee -a ~/played-log.txt |
xargs -d "\n" mpv
done < ~/mediafiles.txt
done
}
我想将 VIDEO_TS 行添加到createmediafiles
,但在playmediafiles
函数中我想添加一个 IF 语句,这样如果混洗到 in 的行mediafiles.txt
是 VIDEO_TS 那么而不是使用 mpv 来播放文件,它将执行以下操作:
tee -a ~/played-log.txt | xargs -d "\n" vlc --fullscreen
管道的读取方式mediafiles.txt
与 mpv 的读取方式相同。
如何将其放入 IF 语句中,条件是该行以 VIDEO_TS 结尾?
答案1
我想你可能会尝试做这样的事情:
playmediafiles() {
local line cmd
while true; do
line=$(shuf -n 1 ~/mediafiles.txt)
case $line in
*VIDEO_TS* ) cmd=( 'echo' 'vlc' '--fullscreen' ) ;;
* ) cmd=( 'echo' 'mpv' ) ;;
esac
cmd+=( "$line" )
printf '%s\n' "$line" >> ~/played-log.txt
"${cmd[@]}"
done
}
或者:
playmediafiles() {
local line cmd
while true; do
while IFS= read -r line; do
case $line in
*VIDEO_TS* ) cmd=( 'echo' 'vlc' '--fullscreen' ) ;;
* ) cmd=( 'echo' 'mpv' ) ;;
esac
cmd+=( "$line" )
printf '%s\n' "$line" >> ~/played-log.txt
"${cmd[@]}"
done < <(shuf ~/mediafiles.txt)
done
}
第一个脚本永远循环调用,shuf
一次随机选择一行mediafiles.txt
并将该行存储在变量中line
。
第二个脚本永远循环调用以随机顺序shuf
打印 的全部内容,然后进行第二次循环,每次从输出中打印 1 行并将该行存储在变量 中。mediafiles.txt
read
shuf
line
然后,两者都测试$line
它是否包含,并使用或使用适当的命令和参数VIDEO_TS
填充数组。然后,他们使用 将 的内容添加到数组的末尾,然后打印数组的内容,然后使用 执行存储在数组中的命令。cmd
cmd=( 'echo' 'vlc' '--fullscreen' )
cmd=( 'echo' 'mpv' )
line
cmd+=( "$line" )
played-log.txt
"${cmd[@]}"
两者之间的唯一区别是第一个生成一个子 shell,为每个要播放的文件调用一次,而第二个生成一个子 shell ,为整个输入文件shuf
调用一次,然后每行调用一次。第二个可能会运行得更快一点,但我怀疑您是否会注意到或关心它,因为您是在每行输入之间播放媒体。shuf
read
完成测试后删除'echo'
s 以确保它符合您的要求。