lowriter Bash 将所有文档就地转换为 pdf 的脚本
lowriter Bash Script to Convert all doc to pdf In-Place
所以..我的任务是使用 lowriter
将一堆 *.doc 文件转换为 *.pdf
我想做的是就地执行此操作,但由于无法使用 lowriter
执行此操作,我想我会捕获原始文件和路径,捕获转换,然后将转换后的文件移动到原路径,然后删除原来的*.doc
问题是我的 sed
和/或 awk
充其量也很弱 ;) 所以我不知道如何从输出中“捕获”转换后的文件名。
我的代码:
#!/bin/bash
FILES=/my/path/**/*.doc
shopt -s globstar
for f in $FILES; do
the_file=$f;
the_orig_dir=$(dirname "$the_file") ;
converted=$(lowriter --headless --convert-to pdf "$the_file");
echo $converted;
done;
输出为:
convert /my/path/Archives/Ally/Heavenly Shop.doc -> /my/Heavenly Shop.pdf using filter : writer_pdf_Export
convert /my/path/Archives/Ally2/Solutions Shop.doc -> /my/Solutions Shop.pdf using filter : writer_pdf_Export
convert /my/path/Archives/Ally3/Xpress Shop.doc -> /my/Xpress Shop.pdf using filter : writer_pdf_Export
我需要做的是在->
之后和:
之前捕获转换文件的path/filename。我只是不知道我该怎么做。有人可以告诉我吗?
#!/bin/bash
FILES=/my/specific/input/folder/**/*.doc
shopt -s globstar
for f in $FILES; do
the_file=$f;
the_orig_dir=$(dirname "$the_file") ;
converted=$(lowriter --headless --convert-to pdf "$the_file");
new_file=$(echo "$converted" | grep -o -P '(?<= -> ).*(?= using filter : )');
new_file_name=$(basename "$new_file");
echo "$the_orig_dir/$new_file_name";
set -x;
rm -f $the_file;
mv "$new_file" "$the_orig_dir/";
set +x;
done;
做我需要它做的事
对您提出的问题的快速回答是,这可以使用任何 sed:
sed 's/.*-> \(.*\) using filter :.*//'
但我不确定您是否真的需要这样做。根据您发布的内容和您在问题下的评论,我认为您真正需要的是:
#!/usr/bin/env bash
shopt -s globstar
docPaths=( /my/path/**/*.doc )
for docPath in "${docPaths[@]}"; do
pdfPath=$(basename "$docPath" '.doc')'.pdf'
lowriter --headless --convert-to pdf "$docPath"
printf '%s\n' "$pdfPath"
done
根据 ed motron 的评论,值得一提的是,libraOffice 编写器将根据 --outdir
(或当前工作文件夹)和请求的转换 (pdf),以可预测的名称放置输出文件。规则可用于构造输出文件的名称。
上面的脚本可以简单写成:
FILES=/my/path/**/*.doc
shopt -s globstar
for f in $FILES; do
lowriter --headless --convert-to pdf "$f"
converted=$(basename "$f" .doc).pdf
# Do something with converted ...
echo "Output: $converted"
done;
所以..我的任务是使用 lowriter
我想做的是就地执行此操作,但由于无法使用 lowriter
执行此操作,我想我会捕获原始文件和路径,捕获转换,然后将转换后的文件移动到原路径,然后删除原来的*.doc
问题是我的 sed
和/或 awk
充其量也很弱 ;) 所以我不知道如何从输出中“捕获”转换后的文件名。
我的代码:
#!/bin/bash
FILES=/my/path/**/*.doc
shopt -s globstar
for f in $FILES; do
the_file=$f;
the_orig_dir=$(dirname "$the_file") ;
converted=$(lowriter --headless --convert-to pdf "$the_file");
echo $converted;
done;
输出为:
convert /my/path/Archives/Ally/Heavenly Shop.doc -> /my/Heavenly Shop.pdf using filter : writer_pdf_Export
convert /my/path/Archives/Ally2/Solutions Shop.doc -> /my/Solutions Shop.pdf using filter : writer_pdf_Export
convert /my/path/Archives/Ally3/Xpress Shop.doc -> /my/Xpress Shop.pdf using filter : writer_pdf_Export
我需要做的是在->
之后和:
之前捕获转换文件的path/filename。我只是不知道我该怎么做。有人可以告诉我吗?
#!/bin/bash
FILES=/my/specific/input/folder/**/*.doc
shopt -s globstar
for f in $FILES; do
the_file=$f;
the_orig_dir=$(dirname "$the_file") ;
converted=$(lowriter --headless --convert-to pdf "$the_file");
new_file=$(echo "$converted" | grep -o -P '(?<= -> ).*(?= using filter : )');
new_file_name=$(basename "$new_file");
echo "$the_orig_dir/$new_file_name";
set -x;
rm -f $the_file;
mv "$new_file" "$the_orig_dir/";
set +x;
done;
做我需要它做的事
对您提出的问题的快速回答是,这可以使用任何 sed:
sed 's/.*-> \(.*\) using filter :.*//'
但我不确定您是否真的需要这样做。根据您发布的内容和您在问题下的评论,我认为您真正需要的是:
#!/usr/bin/env bash
shopt -s globstar
docPaths=( /my/path/**/*.doc )
for docPath in "${docPaths[@]}"; do
pdfPath=$(basename "$docPath" '.doc')'.pdf'
lowriter --headless --convert-to pdf "$docPath"
printf '%s\n' "$pdfPath"
done
根据 ed motron 的评论,值得一提的是,libraOffice 编写器将根据 --outdir
(或当前工作文件夹)和请求的转换 (pdf),以可预测的名称放置输出文件。规则可用于构造输出文件的名称。
上面的脚本可以简单写成:
FILES=/my/path/**/*.doc
shopt -s globstar
for f in $FILES; do
lowriter --headless --convert-to pdf "$f"
converted=$(basename "$f" .doc).pdf
# Do something with converted ...
echo "Output: $converted"
done;