「find」で始まる「sh -c」スクリプトの一重引用符の問題

「find」で始まる「sh -c」スクリプトの一重引用符の問題

私は長い間スクリプトを書いてきましたが、最近この問題のために狂ってしまいました。すべての方法を試しましたが解決されませんでした。

find . -iname "*.mp4" -type f -exec ffmpeg -i "{}" -c:a "$ACODEC" -c:v "$VCODEC" -vf \
    "subtitles={}.$SUBEXTE:'force_style=fontsize=$FSIZE,fontname=$FNAME'" \
"{}.$EXTE" -hide_banner \;

findmp4ファイルが見つかるたびにこのコマンドを実行するのがアイデアですFFmpeg。ただし、最後の変数のコマンド置換など、より複雑なものを試すには、{}.$EXTE次の構文を使用する必要があります。

find . -iname "*.mp4" -type f -exec sh -c 'ffmpeg -i "$1" -c:a "$2" -c:v "$3"\
 -vf "subtitles=$1.$4:'force_style=fontsize=$5,fontname=$6'" \
"$1.$7" -hide_banner' -- "{}" "$ACODEC" "$VCODEC" "$SUBEXTE" "$FSIZE" "$FNAME" "$EXTE" \;

この構文を使用するときに見られるように、単一引用sh -c符を追加する必要があります' '。しかし、これはFFmpegコードを壊します。一重引用符と二重引用符を追加、削除、バックスラッシュを試すなど、ほとんどすべての可能なバリエーションを試しました。助けてください!私が経験したいくつかのエラー:

Unable to open ./sub.srt
[AVFilterGraph @ 0x7fffdb7d35e0] Error initializing filter 'subtitles' with args './sub.srt:force_style=fontsize='
Error reinitializing filters!
Failed to inject frame into filter network: No such file or directory
Error while processing the decoded data for stream #0:0
Conversion failed!
And sometimes I got an error like not suitable format for fontname

答え1

一重引用符で囲まれた文字列には一重引用符を含めることはできません。

あなたの場合、このジレンマの解決策は、'インラインスクリプトsh -cのすべての内部を'\''(または'"'"')に置き換えることです。

整理の目的は

  1. 一重引用符で囲まれた文字列(最初'に終わる'\''一重引用符文字列)を一時的に停止します。
  2. テキストを挿入するには'\'in '\''"'"次のように書くこともできます。遠く参考文献が多すぎて読みにくいです。)
  3. これを残りの元の一重引用符で囲まれた文字列に関連付けます(最後の'inは'\''新しい一重引用符で囲まれた文字列を開始します)。

コマンドsh -cは次のとおりです。

sh -c '
ffmpeg -i "$1" -c:a "$2" -c:v "$3" \
    -vf "subtitles=$1.$4:'\''force_style=fontsize=$5,fontname=$6'\''" \
    "$1.$7" -hide_banner' ...arguments as before ...

関連情報