내 .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
내부에 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
.
두 번째 스크립트는 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[@]}"
둘 사이의 유일한 차이점은 첫 번째는 재생할 각 파일에 대해 한 번 호출되는 하위 쉘을 생성하는 반면, 두 번째는 shuf
전체 입력 파일에 대해 한 번 호출된 다음 한 줄에 한 번씩 호출되는 하위 쉘을 생성한다는 것입니다. 두 번째는 조금 더 빠르게 실행될 수 있지만 각 입력 줄 사이에서 미디어를 재생하고 있기 때문에 눈치 채거나 관심을 가질 것 같지 않습니다.shuf
read
테스트를 마친 후 를 제거하여 'echo'
요구 사항을 충족하는지 확인하세요.