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

问题描述 投票:0回答:3

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

如何保留原始文件树?

linux bash scripting
3个回答
3
投票

Using GNU Tools

GNU find本身可以做你想要的:

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

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

因为当有问题的命令成功时-exec-execdir只传递true,这只会删除soffice能够转换的文件。


On All POSIX Platforms

作为适用于所有版本的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消耗那个子壳,结束了手头的范围。


2
投票

您可以在命令中包含--outdir

soffice --headless --convert-to pdf --outdir "${d%/*}" $d

其中${d%/*}修剪文件名的最后一位并保留目录的基名。

您也可以使用pushdpopd来改变那里的cwd,但我个人更喜欢旗帜选项。


1
投票

我没有安装soffice,但是从OP的答案听起来,适当的标志是去这里的方式。这是使用pushdpopd 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;'
© www.soinside.com 2019 - 2024. All rights reserved.