"find --exec"のシェル変数に "{}"の内容を割り当てる方法

"find --exec"のシェル変数に "{}"の内容を割り当てる方法

ディレクトリ内の各xmlファイルを繰り返し、make NAME =を実行するスクリプトを作成しようとしています。ここで、NMはファイル名の減算です。変数にプレースホルダを割り当てる.xmlのに問題があります。{}〜のように

find . -iname "*.xml" -exec foo=$(echo {}); gmake NAME=$FOO \;

何も割り当てられていないため動作しません$FOO

答え1

IRCで多くの検索をした後、誰かが次の答えを教えてくれました。

find . -iname "*.xml" -exec bash -c 'echo "$1"' bash {} \;

または私の例では(混乱を避けるために文字列を削除してください)

find . -iname "*.xml" -exec bash -c 'gmake NAME="$1"' bash {} \;

どのように機能するかは、bashが次のパラメータを-cパラメータとして取り、何をすべきかbash {}{}割り当て、それをpaddingに使用することです。たとえば、コンテンツはエラーメッセージに使用されるため、単純なプレースホルダではないため、または同じものを使用したくありません。$1$0bash$0$0_''

呼び出しごとに複数のファイルを処理するにはbash

find . -iname "*.xml" -exec bash -c '
   ret=0
   for file do
       gmake NAME="$file" || ret=$?
   done
   exit "$ret"' bash {} +

gmakeこのメソッドには、呼び出しが失敗した場合に終了ステータスfindとして報告されるという追加の利点があります。

より多くの情報は以下から得ることができる。http://mywiki.wooledge.org/UsingFind#Complex_actions

答え2

Simotekの答えは素晴らしいです! 1行に多くのファイルの名前を変更できるようにフォーマットを変更しました。

find * -name "*.sh" -exec bash -c 'OLD=$1; NEW=$(echo $OLD | sed s/OLD-NAME.sh/NEW_NAME.sh/g); mv "$OLD" "$NEW"' _ {} \;

関連情報