我有一个简单的脚本将.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
文件。
如何保留原始文件树?
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' _ {} +
在这里,由(
创建的子壳限定了cd
的效果;然后exec
消耗那个子壳,结束了手头的范围。
您可以在命令中包含--outdir
:
soffice --headless --convert-to pdf --outdir "${d%/*}" $d
其中${d%/*}
修剪文件名的最后一位并保留目录的基名。
您也可以使用pushd
和popd
来改变那里的cwd,但我个人更喜欢旗帜选项。
我没有安装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;'