web-dev-qa-db-fra.com

Exécuter des milliers de commandes de manière séquentielle

J'ai maintenant pour tâche d'exécuter plusieurs milliers de commandes de manière séquentielle. Les commandes sont toutes sous la forme $ /home/user/.lcmodel/bin/lcmodel < 2HzSNR100C2.5.txt. Seuls les nombres (en gras type) diffèrent d'un fichier à l'autre. Les nombres sont générés à partir d'une boucle for dans MatLab.

Par exemple, le nombre précédant Hz sera 2 et 3, le numéro après SNR sera 100 et 200, les chiffres après C sera 2.5, 3 et 3.5. Dans ce cas, je dois exécuter 12 de ce type de commandes. Et oui, je n'ai besoin que de les exécuter sur une seule ligne, les codes détaillés sont déjà stockés dans les fichiers txt.

Je suis complètement nouveau sous Linux. Quelqu'un peut-il m'aider à écrire un fichier ou une commande pour exécuter ces milliers de commandes séquentiellement et automatiquement?

4
Charlie So

Si tous les fichiers se trouvent dans le répertoire de travail actuel (aucun n’est imbriqué dans un sous-répertoire), utilisez une boucle bashfor (grâce à Incnis Mrsi pour le motif de sélection plus étroit):

for f in ?HzSNR???C*.txt; do /home/user/.lcmodel/bin/lcmodel < "$f"; done

Ce motif de globing spécifique est assez serré; Si vous utilisez également globing, la liste ordonnée des fichiers du répertoire de travail en cours sera développée dans l'instruction for, ce qui aboutira en définitive au traitement des fichiers dans leur ordre numérique.

Si tous les fichiers ne sont pas dans le répertoire de travail actuel, utilisez find:

find . -type f -name '?HzSNR???C*.txt' -exec /home/user/.lcmodel/bin/lcmodel < {} \;

Cependant, utiliser find en général ne garantit pas que les fichiers seront traités dans leur ordre numérique; si leur traitement dans l'ordre numérique est obligatoire, utilisez find + sort + xargs:

find . -type f -name '?HzSNR???C*.txt' | sort | xargs -I file /home/user/.lcmodel/bin/lcmodel < file
12
kos