bashrcに "find exec"コマンドを関数としてどのように追加しますか?

bashrcに
find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \;

上記のコマンドを手動で実行すると正常に動作しますが、.bashrcファイルの関数に入れることはできません。エラーを受け取りますunexpected end of line

function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }

ベストアンサー1

あなたのコメントに提供した関数定義は次のとおりです。

function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; }

}関数定義を終了する必要があるセミコロンまたは改行文字が前にありません。エスケープされたセミコロンは重要ではありません。ただ基本をfind終わらせるという引数にすぎません。-execこれは働きます:

function fff { find . -name "*.mov" -exec bash -c 'ffmpeg -i "{}" -c:v libx264 -crf 20 -pix_fmt yuv420p "${0/.mov}.mp4"' {} \; ; }
#                                                                                                             semicolon here: ^^^

...しかし、まだいくつかの問題があります。まず、@Kusalanandaがコメントで述べたように、{}このファイル名をシェルコマンドに直接挿入するのは安全ではありません。これを引数として渡して使用する必要があります"$1"。すでにこれを行いましたが、$0これは実際には通常のパラメータfind-bashではなくコマンド/関数/などの名前で$0なければなりません$1

2番目に(@ Kusalanandaが再び指摘する)、${1/.mov}ファイル名の他の場所に「.mov」がある場合は、以前の「.mov」サフィックスを削除すると正しく機能しない可能性があります${1%.mov}

3番目(そしてそれほど重要ではない)functionは、多くの人が避けたいと思う非標準という屈辱ですfuncname() definition。私はまた、コマンドを区別するためにセミコロンの代わりに改行文字を使用するのが好きです。これらすべての修正を行った後、次のような結果が得られました。

fff() {
    find . -name "*.mov" -exec bash -c 'echo ffmpeg -i "$1" -c:v libx264 -crf 20 -pix_fmt yuv420p "${1%.mov}.mp4"' find-bash {} \;
}

おすすめ記事