Я хочу преобразовать список файлов в каталоге в другой каталог, используя некоторые программы предварительной обработки.
Я знаю, что могу сделать это для одного файла:
cat "$INDIR/$file" | ./program > "$OUTDIR/$file"
И я знаю, что могу сделать это для нескольких файлов:
for file in $(ls -1 $INDIR); do
cat "$INDIR/$file" | ./program > "$OUTDIR/$file";
done
Но проблема в том, что ./program
требуется довольно много времени для инициализации, и я не хочу, чтобы эти издержки повторялись, так как внутри $INDIR
будет много файлов, и мой подход выше всегда перезапускает ./program
для каждого файла в каталоге. Это медленно.
Итак, мой вопрос: есть ли способ выполнить мою задачу выше без повторной инициализации ./program
в bash?
(отредактируйте после @grawity) Понимая, что мы не можем просто передать все файлы за один раз, перейдите в stdin of ./program
чтобы иметь возможность разделить вывод, я ожидаю, что у меня будет возможность создать функцию create_into_pipeline
которая выполняет что-то вроде этот:
process_pipeline = create_into_pipeline(./program.pl | ./program.py | ./program.bash | ./program);
for file in $(ls -1 $INDIR); do
process_pipeline < cat "$INDIR/$file" > "$OUTDIR/$file.new";
done
Если это невозможно, то, я думаю, я пойду с созданием скрипта Python, который будет действовать как веб-сервер, и вызовом ./program
если это необходимо. Но я хочу знать, смогу ли я сделать это в bash, поскольку я считаю, что в bash это будет более эффективным по времени, чем в Python (вы также можете доказать это неправильно, и я продолжу работу с Python).
Еще немного деталей
На самом деле ./program
- это последовательность программ, передаваемых друг другу, как таковая:
./program.pl | ./program.py | ./program.bash | ./program
Я рассмотрел каждую программу, чтобы использовать опцию для обработки одного каталога файлов и вывода в другой каталог, сохраняя имена файлов. Но поскольку у меня там четыре программы, я не хочу создавать три временных каталога, так как доступ к жесткому диску будет медленным. Итак, я не хочу этого:
./program.pl $INDIR $OUTDIR;
./program.py $INDIR $OUTDIR;
./program.bash $INDIR $OUTDIR;
./program $INDIR $OUTDIR;
Просто дополнительная информация на случай, если это может изменить ответ (и фактически последняя программа ./program
не имеет такой возможности для обработки каталога, поэтому я все равно не могу использовать этот подход).