複数のフォルダがあり、各フォルダにCDを挿入してコマンドを実行したいと思います。私はこれが次のようになるべきだと思います。
(次は私がやりたいことを人為的に単純化した例です。)
ls | xargs echo 'Looking at {}' && cd {} && /bin/do_stuff
しかし、これはうまくいきません。どうすればいいですか?
ベストアンサー1
xargs
コマンドが直接実行されるため動作しません。これは、1行のシェルコードも許可せず、実行のためにコマンドをシェルに渡します。実際、これらすべて&&
はシェルによって解釈されます今後 ls
走ってもxargs
。また、{}
はわかりやすい構造find
ですxargs
。
(必要に-I
応じてwithを使用してxargs
この機能をまねることができますfind
。)
最も簡単な方法xargs
は、コマンドをシェルスクリプトに入れることです。
#!/bin/sh
echo "Looking at $1"
cd $1
/bin/do_stuff
(他のサブディレクトリのみを含むディレクトリで実行している限り、失敗しないように見え、失敗しないため、これを実際に置き換えました。 "and"動作が必要な場合は、スクリプトに必要な修正は明らか&&
です。);
echo
cd
次にシェルスクリプトを実行しますxargs
。あなたがそれを呼び出す場合dostuff.sh
:
$ ls | xargs ./dostuff.sh
dostuff.sh
同様に実行可能としてマークする必要がありますchmod +x dostuff.sh
。
おそらく、これらすべてを一行で書く方法がありますsh -c
。しかし、このようなことをする魔法を覚えていなければ、それはただ好奇心に過ぎませんか?