쉘 루프를 사용하여 mkv에서 임의의 자막 형식을 제거하는 방법

쉘 루프를 사용하여 mkv에서 임의의 자막 형식을 제거하는 방법

주어진 경로의 모든 mkv 파일에서 모든 하위 파일을 제거하기 위해 이 스크립트를 만들었습니다. 잘 작동합니다. 하지만 이제는 PGS 자막을 제거하고 언어에 관계없이 모든 SRT 파일을 유지하고 싶습니다.

for file in "$@"*mkv; do
    mkvmerge -o "${file%.mkv}".nosubs.mkv --no-subtitles "$file"
done

보너스: 모든 언어의 모든 SRT 파일을 보존하는 방법.

답변1

출력을 구문 분석하여 필요한 트랙 ID를 얻고 mkvmerge -I( ) 옵션을 사용하여 결과를 쉼표로 구분된 목록으로 전달합니다.--subtitle-tracks-s

SRT 자막만 선택하려면 다음을 사용하세요 sed.

for file in "$@"*.mkv; do
    subs=$(mkvmerge -I "$file" | sed -ne '/^Track ID [0-9]*: subtitles (SubRip\/SRT).*/ { s/^[^0-9]*\([0-9]*\):.*/\1/;H }; $ { g;s/[^0-9]/,/g;s/^,//;p }')
    if [[ -n $subs ]]; then subs="-s $subs"; else subs=-S; fi
    mkvmerge $subs -o "${file%.mkv}".srt-only.mkv "$file"
done

마찬가지로 영어 SRT만 선택하려면:

for file in "$@"*.mkv; do
    subs=$(mkvmerge -I "$file" | sed -ne '/^Track ID [0-9]*: subtitles (SubRip\/SRT).* language:eng.*/ { s/^[^0-9]*\([0-9]*\):.*/\1/;H }; $ { g;s/[^0-9]/,/g;s/^,//;p }')
    if [[ -n $subs ]]; then subs="-s $subs"; else subs=-S; fi
    mkvmerge $subs -o "${file%.mkv}".eng-srt-only.mkv "$file"
done

language:eng다른 언어를 선택하려면 변경하세요 .

답변2

-I의 옵션이 제거되고 출력 JSON mkvmerge으로 대체되었습니다 . -J이것은루마토의 스크립트다음과 함께 사용하기에 적합합니다( jq설치 필요, 참조).이 링크운영 체제에 대한 설치 지침)

#!/bin/bash
# If no directory is given, work in local dir
if [ -d "$1" ] || [ -f "$1" ]; then
  DIR="$1"
else
  echo "No target path given, using working directory '$(pwd)'"
  DIR="." 
fi

# Get all the MKV files in this dir and its subdirs
find "$DIR" -type f -name '*.mkv' | while read filename
do
    subs=$(mkvmerge -J "$filename" | jq -r '.tracks[] | select(.type=="subtitles") | select(.properties.language=="eng").id' | sed 'N;s/\n/,/') 
    if [[ -n $subs ]]
    then
         subs="-s $subs"
    else
        subs=-S
    fi
    echo -e "Extracting tracks \e[1m\e[34m${subs#* }\e[0m from \e[1m\e[34m${filename}\e[0m..."
    mkvmerge $subs -o "${filename%.mkv}".eng-srt-only.mkv "$filename" > /dev/null 2>&1
done

관련 정보