我有一个简单的脚本可以将.docx
转换为.pdf
:
for d in $(find /home/kfalasz/Pulpit/konwersjapdf -maxdepth 3 -name "*.docx")
do
soffice --headless --convert-to pdf $d
rm $d
echo $d
done
效果很好,但是所有转换后的文件都位于/home/kfalasz/Pulpit/konwersjapdf
中,我想将它们保留在原始目录中,例如将文件/home/kfalasz/Pulpit/konwersjapdf/a/plot.docx
转换为.pdf
并保留在/home/kfalasz/Pulpit/konwersjapdf/a/plot.pdf
中并且实际上将文件保留在/home/kfalasz/Pulpit/konwersjapdf/plot.pdf
中。
如何保留原始文件树?
答案 0 :(得分:3)
GNU find
本身可以执行您想要的操作:
find /home/kfalasz/Pulpit/konwersjapdf -maxdepth 3 -name "*.docx" \
-execdir soffice --headless --convert-to pdf '{}' ';' \
-delete
-execdir
使每个命令直接在找到文件的位置运行。
由于-exec
和-execdir
仅在相关命令成功执行时传递true
,因此只会删除soffice
能够转换的文件。
作为适用于find
的所有版本的一种选择,不仅限于GNU版本,请考虑:
find . -maxdepth 3 -name "*.docx" -type f -exec sh -c '
for p do
(cd -- "${p%/*}" || exit; exec soffice --headless --convert-to pdf "${p##*/}") \
&& rm -f -- "$p"
done' _ {} +
在这里,由(
创建的子shell限制了cd
的作用; exec
然后会消耗该子shell,从而结束当前的作用域。
答案 1 :(得分:2)
您可以在命令中包含--outdir
:
soffice --headless --convert-to pdf --outdir "${d%/*}" $d
在${d%/*}
处删除文件名的最后一位并保留目录的基名。
您也可以使用pushd
和popd
来更改此处的cwd,但就我个人而言,我更希望使用flag选项。
答案 2 :(得分:1)
我没有安装soffice
,但是从OP的答案来看,适当的标记是解决方法。这是使用pushd
popd
find
版本
$ find . -maxdepth 3 -name "*.docx" | \
xargs -I {} bash -c 'p="{}";
pushd $(dirname "$p") >/dev/null;
bp=$(basename $p);
soffice --headless --convert-to pdf "$bp";
popd>/dev/null;'