Variadic bash 스크립트를 사용하여 여러 디렉터리에서 명령 실행

Variadic bash 스크립트를 사용하여 여러 디렉터리에서 명령 실행

각각 다음 콘텐츠가 포함된 여러 폴더가 있습니다.

  • 비디오 파일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 파일이 포함된 경로 이름이 주어지면patternvariablemp4file

  • ${mp4file%.mp4}.mkv.mp4경로 이름 끝의 .를 제거 mp4file하고 .mkv.

  • ${mp4file%/*}/Subs경로 이름의 파일 이름 부분과 마지막 부분을 제거 /하고 끝에 mp4file추가하십시오 ./Subs

관련 정보