J'ai un problème de script shell où je reçois un répertoire plein de fichiers d'entrée (chaque fichier contenant de nombreuses lignes d'entrée), et je dois les traiter individuellement, en redirigeant chacune de leurs sorties vers un fichier unique (aka, file_1.input needs à capturer dans file_1.output, etc.).
Pré-parallèle , je voudrais simplement parcourir chaque fichier du répertoire et exécuter ma commande, tout en faisant une sorte de minuterie / technique de comptage pour ne pas submerger les processeurs (en supposant que chaque processus a un temps d'exécution constant). Cependant, je sais que ce ne sera pas toujours le cas, donc l'utilisation d'une solution de type "parallèle" semble être le meilleur moyen d'obtenir le multi-threading du script shell sans écrire de code personnalisé.
Bien que j'aie pensé à quelques façons de fouetter en parallèle pour traiter chacun de ces fichiers (et me permettre de gérer mes cœurs efficacement), ils semblent tous hacky. J'ai ce que je pense être un cas d'utilisation assez facile, je préférerais donc le garder aussi propre que possible (et rien dans les exemples parallèles ne semble ressortir comme étant mon problème.
Toute aide serait appréciée!
exemple de répertoire d'entrée:
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
Scénario:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
Mise à jour : Après avoir lu la réponse d'Ole ci-dessous, j'ai pu rassembler les pièces manquantes pour ma propre implémentation parallèle. Bien que sa réponse soit excellente, voici mes recherches supplémentaires et les notes que j'ai prises:
Au lieu d'exécuter mon processus complet, j'ai pensé commencer par une commande de preuve de concept pour prouver sa solution dans mon environnement. Voir mes deux implémentations différentes (et notes):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
Utilise find (pas ls, qui peut entraîner des problèmes) pour rechercher tous les fichiers applicables dans mon répertoire de fichiers d'entrée, puis redirige leur contenu vers un répertoire et un fichier séparés. Mon problème d'en haut était la lecture et la redirection (le script réel était simple), donc remplacer le script par cat était une bonne preuve de concept.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
Cette deuxième solution utilise le paradigme de variable d'entrée parallèle pour lire les fichiers, mais pour un novice, c'était beaucoup plus déroutant. Pour moi, l'utilisation de find a and pipe a très bien répondu à mes besoins.