入力名と出力名のリストを1行ずつ取得し、変換のためにffmpegに供給するクイックシェルスクリプトがあります。一部の出力パスにはスペースが含まれており、スペースを含むパスをエスケープしたり二重引用符で囲んだりすると、2つのエラーのいずれかが発生します。
入力ファイル
file1.avi "output path"/file1.mp4
file1.avi "output\ path"/file1.mp4
file1.avi "output path/file1.mp4"
file1.avi output\ path/file1.mp4
変換.sh
while read -r file1 file2; do ffmpeg -i "$file1" -c copy -bsf:a aac_adtstoasc $file2; done <list
私が経験するエラーの1つは次のとおりです。
'出力パス'/file1.mp4: そのファイルやディレクトリはありません。
私が経験する別のエラーは次のとおりです。
「出力」に適した出力形式が見つかりません。
入力ファイル行の変更は、スペースをエスケープしようとしたことを示すためです。私も周りに二重引用符を追加しようとしました。ファイル2シェルスクリプトから。
答え1
ファイル名にリテラルバックスラッシュ文字が含まれていないと仮定すると、ファイルでバックスラッシュエスケープを使用する場合(引用符を除くlist
)
file1.avi output\ path/file1.mp4
それではあなたはできます。無視する-r
〜するread
するリテラル文字シーケンスの代わりにエスケープシーケンス(スペースとして解釈されます)を解釈します\
。その後、通常の方法で拡張を二重引用符で囲むことができます。
while read file1 file2; do
ffmpeg -i "$file1" -c copy -bsf:a aac_adtstoasc "$file2"
done <list
表示するには:
$ cat list
file1.avi output\ path/file1.mp4
それから
$ while read file1 file2; do
printf '==%s==\n==%s==\n' "$file1" "$file2"
done <list
==file1.avi==
==output path/file1.mp4==