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 のグロブを使用すると、
  • すべての変数は適切に引用されています。
  • オプションはすべて配列になっています (良い習慣であり、ほぼすべての問題を解決します)。
  • バッククォートは使用せず、$(...)コマンド置換を使用します。
  • bash の算術演算子の使用((...)),
  • サブシェルを使用しない (お使いのバージョンでは、whileループはサブシェルで実行されます)
于 2012-11-26T18:04:04.023 に答える