私の.bashrcには、任意のビデオを再生する機能(以下は参照用に書かれていません)と、すべてのメディアファイルを再生するもう1つの機能があります。たとえば、次のようになります。
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
内にIFステートメントを追加してシャッフルされた行がVIDEO_TSの場合は、mpvを使用してファイルを再生するのではなく、次のようにします。playmediafiles
mediafiles.txt
tee -a ~/played-log.txt | xargs -d "\n" vlc --fullscreen
mediafiles.txt
パイプはmpvと同じ方法で読み取られます。
VIDEO_TSで終わる行に条件付きでこれをIFステートメントに入れます。
答え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
。
2番目のスクリプトは、shuf
印刷されたすべてをランダムな順序で永久に呼び出し、次に毎回出力から1行を印刷し、その行を変数に格納する2番目のループを実行します。mediafiles.txt
read
shuf
line
その後、両方の項目が含まれているかどうかをテストし、$line
適切なコマンドとパラメータを使用して配列を入力しますVIDEO_TS
。次に、を使用して配列の内容を配列の末尾に追加し、配列の内容を印刷してから、を使用して配列に格納されているコマンドを実行します。cmd
cmd=( 'echo' 'vlc' '--fullscreen' )
cmd=( 'echo' 'mpv' )
line
cmd+=( "$line" )
played-log.txt
"${cmd[@]}"
2つの間の唯一の違いは、最初のものは再生するファイルごとに1回呼び出されるサブシェルを生成し、2番目はフルshuf
入力ファイルに対して1回呼び出され、次に1行に1回呼び出されるサブシェルを生成することです。です。 2番目は少し速く実行できますが、各入力行の間でメディアを再生しているので、気づいたり興味があるようには思えません。shuf
read
テストが完了したら、を削除して'echo'
要件を満たしていることを確認してください。