web-dev-qa-db-ja.com

複数のスクリプトを並行して検索して実行する

G'day、

私は午前中この問題を解決しようとしましたが、成功していません。特定のフォルダーで特定のスクリプトを検索し、それらをすべて並行して実行したいと思います。スクリプトの名前は異なりますが、すべて「run.sh」で終わります。私が成功せずに試したものの下。

最初のアプローチは、findを-execdirと組み合わせて使用​​することでした。これは機能しますが、スクリプトは半定量的に実行されます。すべてのスクリプトを同時に(並列に)実行する必要があります。 -execdirでこれを実現するオプションはないようです

find . -name "*run.sh" -type f -execdir 'Nohup' {} '&' \;

次に、並列オプション(-P)があるため、xargsを使用してみました。並列オプションをまだ試していません。それぞれのサブフォルダーでスクリプトを実行するxargsを取得できないためです。以下のコマンドはすべてのスクリプトを実行しますが、コマンドを実行しているフォルダーで実行するため、スクリプト自体は機能しません。スクリプトは、独自のサブフォルダーで実行する必要があります。上記の例では、-execdirは-execではなく、それを実行しています。 xargsでそれを実現するにはどうすればよいですか?

Nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c f\ \{\}

または

Nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "f {}"

または

Nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "./{}" 

私は本当にイライラしていて、助けてくれる誰かがそこにいることを望んでいます。どうもありがとうございます!

3
coder85

Chorobaの答えに触発された:

find . -iname '*run.sh' -printf 'cd %h; ./%f\0' | xargs -L1 -0 -P0 bash -c

-printfを使用して、コマンドラインをビルドできます。 %hはファイルが置かれているディレクトリであり、%fはパス(ベース名)を除いたファイルの名前です。 -Pオプションはxargsで並列処理を有効にし、-L1 -0はコマンドごとに1つのヌル終了行を使用するようにします。

4
muru

実行するコマンドラインを作成してから実行するのはどうですか?

find . -name '*run.sh' -type f -exec \
    echo 'c={}; cd ${c%/*} && Nohup "./${c##*/}" &' \;

出力が必要なものである場合は、| bashを追加して再度実行してください。

1
choroba