각각 다음 콘텐츠가 포함된 여러 폴더가 있습니다.
- 비디오 파일
xFilename.mp4
Subs
많은 srt 파일이 포함된 폴더 입니다xFilename.srt
.
각 폴더에 대해 명령을 bash
실행하여 mkvmerge
각 mp4 파일을 해당 폴더의 모든 srt 파일과 병합 Subs
하고 mp4 파일과 동일한 이름의 mkv 파일을 출력하려면 어떻게 해야 합니까?
그것은 마치
for dir in ./* :
if (there is an mp4 file) :
name = "mp4 file name without the extension, dunno how to do that"
mkvmerge -o ./"$dir"/"$name".mkv ./"$dir"/"$name".mp4 "$dir"/Subs/*.srt
터미널에 어떻게 작성하나요?
답변1
의사코드를 수정하세요.
for mp4file in */*.mp4; do
[ ! -f "$mp4file" ] && continue
mkvmerge -o "${mp4file%.mp4}.mkv" "$mp4file" "${mp4file%/*}/Subs"/*.srt
done
여기서 일어나는 일은 현재 디렉터리의 하위 디렉터리에 있는 모든 MP4 파일을 반복하고 mkvmerge
발견된 각 파일에 대해 명령을 실행한다는 것입니다.
테스트는 [ ! -f "$mp4file" ]
주어진 패턴과 일치하는 파일이 없는 경우를 포착하는 것입니다. 조건이 true(변수에 기존 일반 파일이나 일반 파일에 대한 심볼릭 링크를 참조하지 않는 이름이 포함되어 있는 경우)이면 이 반복을 건너뜁니다 continue
.
확장하면 ${variable%pattern}
변수 값 끝에서 가장 짧은 일치 하위 문자열이 제거됩니다. 이는 특정 MP4 파일이 포함된 경로 이름이 주어지면pattern
variable
mp4file
${mp4file%.mp4}.mkv
.mp4
경로 이름 끝의 .를 제거mp4file
하고.mkv
.${mp4file%/*}/Subs
경로 이름의 파일 이름 부분과 마지막 부분을 제거/
하고 끝에mp4file
추가하십시오 ./Subs