web-dev-qa-db-fra.com

Comment exécuter tous les scripts dans un chemin?

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

13
Lautaro Alvarez

En supposant que chemin signifie chemin d'accès à un répertoire, utilisez run-parts. De man run-parts:

run-parts - run scripts or programs in a directory

Tout d'abord, vous devez définir l'autorisation d'exécution sur tous les scripts que vous souhaitez exécuter. Normalement, run-parts ignorera les répertoires et les fichiers non exécutables résident dans ce répertoire.

Avant d'exécuter, vous devriez vérifier quels fichiers seront exécutés avec l'option --test:

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

Je devrais mentionner que run-parts a une convention de nommage 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.

Vérifiez man run-parts pour avoir plus d’idées.

14
heemayl

Les pièces d’exécution fonctionneront si vos scripts portent les noms corrects. Si vous ne souhaitez pas renommer vos scripts pour les adapter au schéma de nommage complexe de run-parts, 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/null redirige les messages d'erreur afin qu'il ne se plaint pas lors d'une 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 que si ces deux tests réussissent, il tentera d'exécuter le fichier.

9
terdon