我创建了一个脚本,以便自动将相机的视频从DV转换为mkv但是,我无法使其工作,因为它无法正确转义文件名变量。脚本为:
#!/bin/bash
FTITLE="Tapes 2012, Tape 01 - "
i=1;
find ./ -type f -name "dv_*.dv" | while read fname; do
CTIME=`stat -c %Y ${fname}`
FNAME="${FTITLE} - ${i}.mkv"
/usr/bin/ffmpeg -i ${fname} ${x264_OPTIONS} ./"$FNAME"
let i=$i+1
done
运行脚本时,我看到以下错误:
[NULL @ 0x645f40] Unable to find a suitable output format for '2012,'
2012,: Invalid argument
显然,这是脚本和文件名的问题。我试图逃避它
/usr/bin/ffmpeg -i ${fname} ${x264_OPTIONS} ./""$FNAME""
但它也没有奏效。
使用更多引号!!引用您拥有的每个变量!
代替您的脚本,我会执行以下操作:
#!/bin/bash
ftitle="Tapes 2012, Tape 01 - "
x264_options=( your options here in an array that is good practice "and quote if you have an option with spaces" )
shopt -s globstar
shopt -s nullglob
((i=1))
for fname in **/dv_*.dv; do
[[ -f $fname ]] || continue
ctime=$(stat -c %Y "$fname")
fnameuppercase="$ftitle - $i.mkv"
/usr/bin/ffmpeg -i "$fname" "${x264_options[@]}" ./"$fnameuppercase"
((++i))
done
与您的有几个不同之处:
- 使用小写变量名称。使用大写变量名称被认为是不好的做法,
- 在这里毫无用处地使用
find
,因为你的搜索是如此微不足道:使用 bash 的 glob 代替, - 所有变量都正确引用,
- 选项都在一个数组中(很好的做法!并解决了几乎所有问题),
- 不使用反引号,而是使用
$(...)
命令替换, - 使用 bash 的算术运算符
((...))
, - 不使用子外壳(在您的版本中,
while
循环在子外壳中执行)