查找文件,将其转换并保留在bash的原始目录中

时间:2018-09-13 15:25:45

标签: linux bash scripting

我有一个简单的脚本可以将.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中。

如何保留原始文件树?

3 个答案:

答案 0 :(得分:3)

使用GNU工具

GNU find本身可以执行您想要的操作:

find /home/kfalasz/Pulpit/konwersjapdf -maxdepth 3 -name "*.docx" \
  -execdir soffice --headless --convert-to pdf '{}' ';' \
  -delete

-execdir使每个命令直接在找到文件的位置运行。

由于-exec-execdir仅在相关命令成功执行时传递true,因此只会删除soffice能够转换的文件。


在所有POSIX平台上

作为适用于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%/*}处删除文件名的最后一位并保留目录的基名。

您也可以使用pushdpopd来更改此处的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;'