web-dev-qa-db-fra.com

Rechercher et exécuter plusieurs scripts en parallèle

G'day

J'ai essayé de résoudre ce problème toute la matinée mais je n'ai pas eu de succès. Je voudrais rechercher certains scripts dans un dossier particulier et les exécuter tous en parallèle. Les scripts ont des noms différents, mais se terminent tous par "run.sh". Ci-dessous ce que j'ai essayé sans succès.

La première approche consistait à utiliser find en combinaison avec -execdir. Cela fonctionne, cependant, les scripts sont exécutés de manière séquentielle. Je veux que tous les scripts soient exécutés simultanément (en parallèle). Il semble n'y avoir aucune option pour y parvenir avec -execdir

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

Ensuite, j'ai essayé d'utiliser xargs car il existe une option parallèle (-P). Je n'ai pas encore essayé l'option parallèle, car je ne parviens pas à obtenir xargs pour exécuter les scripts dans leurs sous-dossiers respectifs. Les commandes ci-dessous exécutent tous les scripts, mais le font dans le dossier dans lequel j'exécute la commande. Par conséquent, les scripts eux-mêmes ne fonctionnent pas. Les scripts doivent être exécutés dans leurs propres sous-dossiers. Dans l'exemple ci-dessus, -execdir fait cela par opposition à -exec. Comment est-ce que je réalise cela avec xargs?

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

ou

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

ou

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

Je suis vraiment frustré et j'espère qu'il y a quelqu'un qui peut aider. Merci beaucoup!

3
coder85

Inspiré par la réponse de choroba:

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

Vous pouvez utiliser -printf pour construire la ligne de commande. %h est le répertoire dans lequel se trouve le fichier et %f est le nom du fichier sans le chemin d'accès (le nom de base). L'option -P active le parallélisme dans xargs, et -L1 -0 lui fait utiliser une ligne d'entrées terminée par un zéro par commande.

4
muru

Qu'en est-il de créer les lignes de commande que vous voulez exécuter, puis de les exécuter?

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

Si vous souhaitez obtenir le résultat souhaité, ajoutez simplement | bash et exécutez-le à nouveau.

1
choroba