DVD를 포함하여 시스템에서 임의의 비디오를 재생합니다.

DVD를 포함하여 시스템에서 임의의 비디오를 재생합니다.

내 .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를 사용하여 파일을 재생하는 대신 다음을 수행하도록 하려고 합니다.playmediafilesmediafiles.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.txtreadshufline

그런 다음 두 가지 모두 해당 항목이 포함되어 있는지 테스트 $line하고 적절한 명령 및 매개변수를 사용하여 배열을 채웁니다 VIDEO_TS. 그런 다음 를 사용하여 배열의 내용을 배열 끝에 추가하고, 배열의 내용을 인쇄한 다음, 를 사용하여 배열에 저장된 명령을 실행합니다.cmdcmd=( 'echo' 'vlc' '--fullscreen' )cmd=( 'echo' 'mpv' )linecmd+=( "$line" )played-log.txt"${cmd[@]}"

둘 사이의 유일한 차이점은 첫 번째는 재생할 각 파일에 대해 한 번 호출되는 하위 쉘을 생성하는 반면, 두 번째는 shuf전체 입력 파일에 대해 한 번 호출된 다음 한 줄에 한 번씩 호출되는 하위 쉘을 생성한다는 것입니다. 두 번째는 조금 더 빠르게 실행될 수 있지만 각 입력 줄 사이에서 미디어를 재생하고 있기 때문에 눈치 채거나 관심을 가질 것 같지 않습니다.shufread

테스트를 마친 후 를 제거하여 'echo'요구 사항을 충족하는지 확인하세요.

관련 정보