У меня проблема со сценариями оболочки, когда у меня есть каталог, полный входных файлов (каждый файл содержит много входных строк), и мне нужно обрабатывать их индивидуально, перенаправляя каждый из их выходных данных в уникальный файл (иначе, file_1.input needs). быть захваченным в file_1.output и т. д.).
Предварительно , я бы просто перебирал каждый файл в каталоге и выполнял свою команду, выполняя какую-то технику таймера / подсчета, чтобы не перегружать процессоры (предполагая, что каждый процесс имел постоянное время выполнения). Однако я знаю, что это не всегда так, поэтому использование «параллельного» решения кажется лучшим способом получить многопоточность сценария оболочки без написания специального кода.
Хотя я подумал о некоторых способах параллельного запуска для обработки каждого из этих файлов (и позволяющего мне эффективно управлять своими ядрами), все они кажутся хакерскими. У меня есть то, что я считаю довольно простым вариантом использования, поэтому я предпочел бы сохранить его как можно более чистым (и ничто в параллельных примерах, кажется, не выпрыгивает из моей проблемы).
Любая помощь будет оценена!
Пример входного каталога:
> ls -l input_files/
total 13355
location1.txt
location2.txt
location3.txt
location4.txt
location5.txt
Автор сценария:
> cat proces_script.sh
#!/bin/sh
customScript -c 33 -I -file [inputFile] -a -v 55 > [outputFile]
Обновление : после прочтения ответа Оле ниже, я смог собрать недостающие фрагменты для моей собственной параллельной реализации. Хотя его ответ хорош, вот мое дополнительное исследование и заметки, которые я сделал:
Вместо того чтобы запускать весь процесс, я решил начать с команды проверки концепции, чтобы доказать его решение в моей среде. Смотрите мои две разные реализации (и заметки):
find /home/me/input_files -type f -name *.txt | parallel cat /home/me/input_files/{} '>' /home/me/output_files/{.}.out
Использует find (не ls, это может вызвать проблемы), чтобы найти все применимые файлы в моем каталоге входных файлов, а затем перенаправляет их содержимое в отдельный каталог и файл. Моей проблемой сверху было чтение и перенаправление (фактический скрипт был прост), поэтому замена скрипта на cat была хорошим доказательством концепции.
parallel cat '>' /home/me/output_files/{.}.out ::: /home/me/input_files/*
Это второе решение использует парадигму входной переменной параллельного интерфейса для чтения файлов, однако для новичка это было гораздо более запутанным. Для меня использование find и pipe отвечает моим потребностям.