Как сделать цикл для компиляции документов groff в определенную папку

У меня есть несколько документов .ms, разбросанных по разным папкам, и я хотел бы сделать скрипт, который компилирует каждый документ .ms и выводит соответствующий файл .pdf в определенную папку.

Структура папок следующая:

/home/user/foo/folder1/file1.ms
/home/user/foo/folder2/file2.ms
/home/user/foo/folder3/file3.ms
...

Вот что я сделал до сих пор:

#!/bin/bash
folder="/home/user/foo/"
file=$(du -a "$folder" | grep ".ms" | cut -f2- | sort)

Однако я не знаю, как сделать цикл, который будет превращать каждую строку вывода в соответствующий файл .pdf, например:

/home/user/foo/bar/file1.pdf
/home/user/foo/bar/file2.pdf
/home/user/foo/bar/file3.pdf
...

Команда groff, которую я использую для компиляции .ms в .pdf:

groff -k -T pdf -ms file.ms > file.pdf

РЕДАКТИРОВАТЬ

Благодаря ответу @dash-o я обновил свой скрипт следующим образом:

#!/bin/bash
input="/home/user/foo/"
output="/home/user/foo/bar"
find $input -name '*.ms' -execdir sh -c 'groff -k -T pdf -ms {} > $output$(basename {} .ms).pdf' \;

Однако это компилирует только первый документ и помещает его не в выходной каталог, а в тот же каталог, что и файл .ms, и я получаю 1: Синтаксическая ошибка:) неожиданно.


person Emperor_Udan    schedule 03.10.2020    source источник


Ответы (1)


На поверхности необходимы два шага:

  • Найдите все файлы '.ms' (используя find...)
  • Преобразуйте каждый в PDF (используя -execdir при поиске)
folder=...
find $folder -name '*.ms' -execdir sh -c 'groff -k -t -pdf -ms {} > $(basename {} .ms).pdf' \;
person dash-o    schedule 03.10.2020