Я хочу перетворити список файлів у каталозі в інший каталог, використовуючи деякі програми попередньої обробки.
Я знаю, що можу зробити це для одного файлу:
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 ./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, оскільки я вважаю, що він буде більш ефективним у часі, ніж у Python (ви також можете довести, що ця помилка є неправильною, і я піду вперед з Python).
Декілька деталей
The ./program
насправді послідовність програм, що передаються один одному, як такі:
./program.pl | ./program.py | ./program.bash | ./program
Я розглядав кожну програму, щоб використовувати опцію для обробки одного каталогу файлів і виведення в інший каталог, зберігаючи імена файлів. Але оскільки у мене є чотири програми, я не хочу створювати три тимчасові каталоги, оскільки доступ до жорсткого диска буде повільним. Отже, я не хочу цього:
./program.pl $INDIR $OUTDIR;
./program.py $INDIR $OUTDIR;
./program.bash $INDIR $OUTDIR;
./program $INDIR $OUTDIR;
Просто додаткову інформацію, якщо вона може змінити відповідь (і фактично остання програма ./program
не має такої можливості для обробки каталогу, тому я не можу йти з цим підходом).
$INDIR
, так що я не можу це зробити.
for file in $INDIR/*; do
?