Comment exécuter tous les scripts d'un chemin?

13

Supposons que j'ai un script qui reçoit un chemin d'accès en tant que paramètre. Comment pourrais-je exécuter tous les scripts situés dans ce chemin?

Lautaro Alvarez
la source

Réponses:

14

En supposant par chemin que vous vouliez dire chemin vers un répertoire, utilisez run-parts. De man run-parts:

run-parts - run scripts or programs in a directory

Au début, vous devez définir l'autorisation d'exécution sur tous les scripts que vous souhaitez exécuter. Ignore normalement run-partsles répertoires et les fichiers qui ne sont pas exécutables résident dans ce répertoire.

Bien qu'avant l'exécution, vous devez vérifier quels fichiers seront exécutés par l' --testoption:

run-parts --test /path/to/directory

Je dois mentionner qu'il run-partsa une convention de dénomination stricte pour les scripts à exécuter:

If neither the --lsbsysinit option nor the --regex option is given 
then the names must consist entirely of ASCII upper- and
lower-case letters, ASCII digits, ASCII underscores, and ASCII minus-hyphens.

Cochez man run-partspour avoir plus d'idée.

heemayl
la source
En lisant un peu, j'ai trouvé ceci: #! / Bin / bash scripts_to_run_dir = / home / you / Dropbox / scripts_to_run pour le script dans "$ scripts_to_run_dir" / * do if test -x "$ script"; puis "$ script" fi done Cela a fonctionné pour moi, qu'en pensez-vous?
Lautaro Alvarez
@LautaroAlvarez Ce que vous faites avec ce script, pourrait être facilement fait avec une simple commande run-parts /home/you/Dropbox/scripts_to_run.. faites attention au nommage cependant ..
heemayl
run-parts est cool. Mais il a créé cron.d et écrit dans syslog sous le nom cron.notice. Mais c'est une bonne source d'idées, comme ignorer les fichiers temporaires et de sauvegarde ...
mmv-ru
9

Les run-parts fonctionneront si vos scripts ont les noms corrects. Si vous ne voulez pas vous occuper de renommer vos scripts en fonction run-partsdu schéma de nommage complexe de, vous pouvez faire quelque chose d'aussi simple que

for file in ~/target/*; do $file 2>/dev/null; done

Cela tentera d'exécuter tous les fichiers (et répertoires) trouvés dans ~/target. Le 2>/dev/nullredirige les messages d'erreur afin de ne pas se plaindre lors de la tentative d'exécution de répertoires ou de fichiers non exécutables.

Alternativement, vous pouvez essayer le plus sophistiqué

for file in ~/target/*; do
    [ -f "$file" ] && [ -x "$file" ] && "$file"
done

Cela vérifiera si chacun des résultats est un fichier ( [ -f $file ]), est exécutable ( [ -x $file ]) et seulement si ces deux tests réussissent, il tentera d'exécuter le fichier.

terdon
la source
Celui-ci a parfaitement fonctionné pour moi dans un projet (un dépôt fourchu) sur lequel je travaille - github.com/rattfieldnz/Vaprobash/blob/master/setup_projects.sh .
Rob