2016-05-31 13 views
2

これは私のシナリオですが、私はn個の可能性を持つフォルダB、C、Dを含むAというルートフォルダを持っています。それらの各フォルダにはbashスクリプトがあります。これらのbashスクリプトを入手して、bashスクリプトを使用して実行するにはどうすればよいですか。Bashはすべてのディレクトリに名前付きの特定のファイルを取得し、スクリプトを実行します

A/B/run.sh 
A/C/run.sh 
A/D/run.sh 
+0

を実行し、彼らは任意の引数が必要ですか?問題はどうなるの? – Rob

+0

命令は問題ではなく、引数を必要としません – yetanotherposter

+1

コードを投稿するのを忘れました! StackOverflowは、人々がコードを修正する手助けをしています。無料のコーディングサービスではありません。どのコードもコードなしより優れています。たとえあなたがそれを書く方法を知らなくても、プログラムがうまくいくと思っていることをメタコードが示してくれます。 – ghoti

答えて

3

簡単:)

eval "$(ls A/*/run.sh)" 

lsがスクリプトへのパスとファイルのリストを返します。

「」$の周りに()結果は

evalはスクリプトとして返された行を実行する新しい行を保つことを確認します(あなたも見つける使用することができます)。

スクリプトの名前にスペースが含まれていて、これが脆弱な解決方法である可能性があることに気をつけてください。しかし、それがあなたが示したように見えれば、うまくいくはずです。

~/ eval "$(ls */run.sh)" 
I am running and my name is: one/run.sh 
I am running and my name is: two/run.sh 

run.shスクリプトは次のとおりです:検索で

echo "I am running and my name is: $0" 
+0

感謝は期待どおりに機能します! – yetanotherposter

+0

うれしいです。 – Rob

+1

@yetanotherposter:もう一つの解決策はより一般的で、その中に非標準のディレクトリ名を簡単に収容することができます。 – sjsam

5

:見つかった各*.shに対して

find . -name *.sh -type f -exec bash -c '[[ -x {} ]] || chmod u+x {}; {}' \; 

これは、例えば出力され

  • ファイルパーミッション
  • を実行している場合は設定されていない場合は、チェックは、ユーザー
  • の許可を実行するスクリプト
+1

これは最良の再帰的解決策でなければなりません。 :-) – sjsam

+1

私はbashの 'globstar'機能が' find'よりも再帰的に物事を見つけるのがかなり速いことを発見しました。 YMMV。これは埋め込まれた 'ls'ソリューションよりも優れているからです。 – ghoti

+0

@ghoti 'globstar'トリックをありがとう。 – SLePort

関連する問題