サブシェルfind -exec
に複数の引数を渡す方法はありますか?bash -c
このアクション呼び出しが行われると、"*dogs.mp4
globパターンと一致するすべてのビデオを検索し(たとえば)、サブシェルで実行してファイルが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 -c
from-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 {} +