如何进行循环以将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
...

我用来将.ms编译为.pdf的groff命令是:

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:语法错误:“)”意外”。

解决方法

表面上,需要两个步骤:

  • 查找所有“ .ms”文件(使用find ...)
  • 将每一个都转换为PDF(在搜索结果上使用-execdir)
folder=...
find $folder -name '*.ms' -execdir sh -c 'groff -k -t -pdf -ms {} > $(basename {} .ms).pdf' \;
,
.map()