1

我创建了一个脚本,以便自动将我的相机视频从 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\""

但它也没有奏效。

4

1 回答 1

1

使用更多报价!!!引用你拥有的每一个变量!

而不是你的脚本,我会做以下事情:

#!/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 的算术运算符((...))
  • 不使用子shell(在您的版本中,while循环在子shell中执行)
于 2012-11-26T18:04:04.023 回答