「find -exec」から「bash -c」サブシェルに複数の引数を渡すには?

「find -exec」から「bash -c」サブシェルに複数の引数を渡すには?

サブシェルfind -execに複数の引数を渡す方法はありますか?bash -c

このアクション呼び出しが行われると、"*dogs.mp4globパターンと一致するすべてのビデオを検索し(たとえば)、サブシェルで実行してファイルがffmpegすでに存在することを確認して警告します。

find . -iname "*.mp4" -exec bash -c 'if [[ -f "${1%.*}_540.mp4" ]]; then echo "Already exists: $1"; else ffmpeg -i "$1" -vf "scale=540:-1" "${1%.*}_540.mp4" ; fi ;' _ {} +

540サイズのハードコーディングを避けるために、後で$2サイズをパラメータとして渡し、コマンドが次のようになりました{}_ {} 540 +

find . -iname "*.mp4" -exec bash -c 'if [[ -f "${1%.*}_$2.mp4" ]]; then echo "Already exists: $1"; else ffmpeg -i "$1" -vf "scale=%2:-1" "${1%.*}_%2.mp4" ; fi ;' _ {} 540 +

上記の行でエラーが発生しましたfind: -exec: no terminating ";" or "+"。 ::

私が理解したように、これはファイル名のプレースホルダーである{}か、{} +コマンド{} \;の最後になければなりません。

この場合、bash -cfrom-exec句に追加のパラメータをどのように渡すことができますか?

ベストアンサー1

あなたは議論できません。後ろに{}を使用している場合は+確認してください。仕様:

-exec ... 2 文字の "{}" のみを含む引数の直後にあるプラス記号だけが、基本式の終わりを強調します。プラス記号の他の用途は特別な用途と見なすべきではありません。

また、(+を使用)複数の引数をシェルに渡しますが、$1その引数だけを使用すると、見つかった残りのファイルは無視されます。シェルコマンドにループを入れる必要があります。バラよりhttps://unix.stackexchange.com/a/321753/135943いくつかの例を挙げると、通常は次のようになります。

find dirname ... -exec sh -c 'for f do somecommandwith "$f"; done' placeholder {} +

それにもかかわらず、サイズを「ハードコーディング」しています。実際のシェルコマンドにハードコードすることもできます。これは最後の引数リストにハードコードするよりも簡単です。でも頑張れば通過できますよ540 変える下線(たとえば、上記のコマンドで「プレースホルダ」の置き換え)を入力し、$0シェルコマンドの内部からアクセスします。


見つかったすべてのファイルを渡してループで処理したい場合は、コマンドに含まれているシェルコマンドに追加のパラメータを渡す方法に関するより一般的な質問については、次のようにしますfind ... -exec

find dirname ... -exec sh -c 'arg1="$1"; arg2="$2"; shift 2; for f do somecommandwith "$f" "$arg1" "$arg2"; done' placeholder firstextraarg secondextraarg {} +

しかし、本当の質問は、なぜこれをしたいのですか? 「firstextraarg」と「secondextraarg」の値をシェルコマンドに直接入力する方が簡単です。

find dirname ... -exec sh -c 'for f do somecommandwith "$f" firstextraarg secondextraarg; done' placeholder {} +

おすすめ記事