ディレクトリ内の各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
$0
bash
$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"' _ {} \;