Tengo un problema de scripting de shell en el que recibo un directorio lleno de archivos de entrada (cada archivo contiene muchas líneas de entrada), y necesito procesarlos individualmente, redirigiendo cada una de sus salidas a un archivo único (también conocido como file_1.input necesita para ser capturado en file_1.output, y así sucesivamente).
Antes del paralelo , simplemente iteraría sobre cada archivo en el directorio y realizaría mi comando, mientras realizaba algún tipo de técnica de temporizador / conteo para no abrumar a los procesadores (suponiendo que cada proceso tuviera un tiempo de ejecución constante). Sin embargo, sé que ese no siempre será el caso, por lo que usar una solución similar a "paralela" parece ser la mejor manera de obtener múltiples secuencias de comandos de shell sin escribir código personalizado.
Si bien he pensado en algunas formas de acelerar en paralelo para procesar cada uno de estos archivos (y permitirme administrar mis núcleos de manera eficiente), todos parecen extravagantes. Tengo lo que creo que es un caso de uso bastante fácil, por lo que preferiría mantenerlo lo más limpio posible (y nada en los ejemplos paralelos parece ser mi problema).
¡Cualquier ayuda sería apreciada!
ejemplo de directorio de entrada:
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
Guión:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
Actualización : Después de leer la respuesta de Ole a continuación, pude juntar las piezas que faltaban para mi propia implementación paralela. Si bien su respuesta es excelente, aquí está mi investigación adicional y las notas que tomé:
En lugar de ejecutar mi proceso completo, pensé en comenzar con un comando de prueba de concepto para probar su solución en mi entorno. Vea mis dos implementaciones diferentes (y notas):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
Utiliza find (no ls, que puede causar problemas) para encontrar todos los archivos aplicables dentro de mi directorio de archivos de entrada y luego redirige sus contenidos a un directorio y archivo por separado. Mi problema desde arriba fue leer y redirigir (el guión real era simple), por lo que reemplazar el guión con gato fue una buena prueba de concepto.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
Esta segunda solución utiliza el paradigma variable de entrada de paralelo para leer los archivos, sin embargo, para un novato, esto era mucho más confuso. Para mí, usar find a and pipe satisfizo mis necesidades perfectamente.