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 "./{}"
私は本当にイライラしていて、助けてくれる誰かがそこにいることを望んでいます。どうもありがとうございます!
Chorobaの答えに触発された:
find . -iname '*run.sh' -printf 'cd %h; ./%f\0' | xargs -L1 -0 -P0 bash -c
-printf
を使用して、コマンドラインをビルドできます。 %h
はファイルが置かれているディレクトリであり、%f
はパス(ベース名)を除いたファイルの名前です。 -P
オプションはxargs
で並列処理を有効にし、-L1 -0
はコマンドごとに1つのヌル終了行を使用するようにします。
実行するコマンドラインを作成してから実行するのはどうですか?
find . -name '*run.sh' -type f -exec \
echo 'c={}; cd ${c%/*} && Nohup "./${c##*/}" &' \;
出力が必要なものである場合は、| bash
を追加して再度実行してください。