次のスクリプトは、play_movie.sh
自動的に映画(現在のディレクトリに映画が1つしかない場合)を選択して使用するように設計されていますffplay
。それ以外の場合は、ユーザーに一連の映画を表示し、ユーザーの入力(再生する映画)を受け入れるように設計されています。
#!/usr/bin/bash
output_a=$(ls -R *.[aA][vV][iI] 2>/dev/null)
output_m=$(ls -R *.[mM][kKpP][vV4]] 2>/dev/null)
output_v=$(ls -R *.[vV][oO][bB]] 2>/dev/null)
all_exts="${output_a}${output_m}${output_v}"
ln_cnt=$(echo "${all_exts}" | wc -l)
if [[ "$ln_cnt" -eq 1 ]]; then
echo -e "Playing: ${all_exts}\n"
ffplay -hide_banner -infbuf -fs -sn -ast a:0 "${all_exts}"
elif [[ "$ln_cnt" -gt 1 ]]; then
printf "Select a file out of the list below"
ls -R *.[aA][vV][iI] 2>/dev/null
ls -R *.[mM][kKpP][vV4] 2>/dev/null
ls -R *.[vV][oO][bB] 2>/dev/null
read line; ffplay -hide_banner -infbuf -fs -sn -ast a:0 "$line"
fi
このスクリプトに関する私の質問は次のとおりです。
if
現在、ディレクトリに多くの映画がある場合でも、スクリプトは問い合わせの最初の四半期を実行します。それから私は理解しましたNo such file or directory
。- 上映する映画がひとつだけなら私は
No such file or directory
…
ls
過去の結果に頼るのが難しいです。このスクリプトを使用せずに変更できますかfind
?
ベストアンサー1
「現在のディレクトリに1つしかない」部分が正しいとします(つまり現在ディレクトリにあるファイルにのみ興味があります。ls
以下はもちろんを使用する必要はありませんfind
。
#!/usr/bin/bash -
shopt -s nullglob
set -- *.[aA][vV][iI] *.[mM][kKpP][vV4] *.[vV][oO][bB]
if [[ "$#" -eq 1 ]]; then
printf>&2 "Playing: %s\n\n" "$@"
ffplay -hide_banner -infbuf -fs -sn -ast a:0 -- "$@"
elif [[ "$#" -gt 1 ]]; then
printf>&2 "Select a file out of the list below:\n"
printf>&2 "%s\n" "$@"
IFS= read -r line &&
ffplay -hide_banner -infbuf -fs -sn -ast a:0 -- "$line"
fi
この設定は、nullglob
一致しないglobを削除し、パラメータを一致するすべてのファイルに設定します。
図からわかるようにStefan Chazerasの答えselect
、ユーザーエクスペリエンスを向上させるために使用できます(select
位置パラメータはデフォルトで使用され、上記の使用方法とよく合いますset
)。
#!/usr/bin/bash -
shopt -s nullglob
set -- *.[aA][vV][iI] *.[mM][kKpP][vV4] *.[vV][oO][bB]
if [[ "$#" -eq 1 ]]; then
printf>&2 "Playing: %s\n\n" "$@"
ffplay -hide_banner -infbuf -fs -sn -ast a:0 -- "$@"
elif [[ "$#" -gt 1 ]]; then
select video; do
ffplay -hide_banner -infbuf -fs -sn -ast a:0 -- "$video"
exit
done
fi