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"

これはハウジング部分に関するものです。複雑なフィルタが本当に必要かどうかはわかりません。

関連情報