Bash

ffmpeg:來自 bash 腳本的帶有空格的文件名

  • February 11, 2019

我編寫了以下 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"

這只是關於外殼部分;我不確定是否真的需要復雜的過濾器。

引用自:https://unix.stackexchange.com/questions/499883