ffmpeg: bash 스크립트에 공백이 있는 파일 이름

ffmpeg: bash 스크립트에 공백이 있는 파일 이름

ffmpeg를 사용하여 mp3 파일을 자동으로 연결하기 위해 다음 bash 스크립트를 작성했습니다.

i=0
for f in "${@:2}"
do
        filter+="[$i:a:0]"
        i=`expr $i + 1`
        files+="-i $f "
done
filter+="concat=n=$i:v=0:a=1[outa]"
ffmpeg $files -filter_complex $filter -map '[outa]' "$1.mp3"

그러나 파일 이름에 공백이 포함된 파일을 처리해야 하는 경우가 종종 있지만 터미널로 드래그하면 모든 공백이 이스케이프되어 다음 명령 호출이 생성됩니다.

./mergemp3.sh outfilename /path/to/my\ file\ with\ spaces.mp3 /path/to/another\ file\ with\ spaces.mp3 

나에게는 이것이 맞는 것 같다. 그러나 ffmpeg는 실패합니다

/path/to/my: No such file or directory

분명히 ffmpeg는 백슬래시로 올바르게 이스케이프 처리되었음에도 불구하고 파일 이름의 공백을 이해하지 못합니다. 파일 이름 목록에 대한 좋은 세부 정보가 있는 것 같아요. 어떤 아이디어가 있나요?

답변1

명령줄을 작성할 때 명확성과 안전성을 위해 배열을 사용하는 것이 좋습니다.

files=()
i=0
for f in "${@:2}"
do
        filter+="[$((i++)):a:0]"
        files+=(-i "$f")
done
filter+="concat=n=$i:v=0:a=1[outa]"
ffmpeg "${files[@]}" -filter_complex "$filter" -map '[outa]' "$1.mp3"

답변2

이것을 시도해 보십시오. 이것은 단지 bash(내가 처음으로 사용한 것을 기준으로) 모든 쉘에서 작동할 것입니다.답변@Kusalananda를 통해):

output=$1; shift
i=0
for f in "$@"; do
        shift
        set -- "$@" -i "$f"
        filter="$filter[$i:a:0]"
        i=$((i+1))
done
filter="${filter}concat=n=$i:v=0:a=1[outa]"
ffmpeg "$@" -filter_complex $filter -map '[outa]' "$output.mp3"

이것은 하우징 부분에 관한 것입니다. 복잡한 필터가 실제로 필요한지 잘 모르겠습니다.

관련 정보