Bash
ffmpeg:來自 bash 腳本的帶有空格的文件名
我編寫了以下 bash 腳本來使用 ffmpeg 自動連接 mp3 文件:
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 不理解文件名中的空格,儘管它被反斜杠正確轉義。我想關於該文件名列表只有一個漂亮的細節。有任何想法嗎?
為了在建構命令行時清晰和安全,數組是你的朋友:
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"
試試這個,它應該適用於任何 shell,而不僅僅是
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"
這只是關於外殼部分;我不確定是否真的需要復雜的過濾器。