【问题标题】:lowriter Bash Script to Convert all doc to pdf In-Placelowriter Bash 脚本将所有 doc 就地转换为 pdf
【发布时间】:2020-08-05 12:45:01
【问题描述】:

所以.. 我的任务是使用 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

我需要做的是在-> 之后和: 之前捕获转换文件的路径/文件名。我只是不知道我该怎么做。谁能告诉我?

【问题讨论】:

  • 我以前从未听说过lowriter ,但它真的没有选项只输出新文件路径或给你一个选项来指定输出文件或将它的输出发送到标准输出(所以你可以重定向到一个输出文件名)?
  • 它没有就地转换的方法...它输出我在问题中发布的内容...
  • 我不是在谈论转换“就地”,而是在讨论控制输出去向的选项。另外 - 在调用lowriter 之前,您是否已经知道输出文件名?看起来总是/my/$(basename "$the_file")
  • 那将是原始文件。不是转换后的文件。是的,您可以指定输出目录,但不能指定输出文件名。
  • 顺便说一句,所有尾随分号都是无用的。为什么你调用你的循环变量f,然后将它复制到另一个变量?如果您需要,请使用for the_file in

标签: bash awk sed libreoffice libreoffice-writer


【解决方案1】:

对您提出的问题的快速回答是,这可以使用任何 sed:

sed 's/.*-> \(.*\) using filter :.*/\1/'

但我不确定您是否真的需要这样做。根据您在问题下发布的内容和您的 cmets,我认为您真正需要的是:

#!/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

【讨论】:

    【解决方案2】:
    #!/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;
    

    做我需要做的事

    【讨论】:

    • 这是一种非常复杂的、不可移植的方式来做这么简单的事情。
    • 我不需要它是便携的。我需要它来做我在问题中提出的问题,而且它确实如此
    • grep -P 如果你有它很好;但是 Ed Morton 的 sed 解决方案更便携,可以说更简单。
    • 它会工作如果你有一个特定版本的grep,GNU grep,它不会在其他任何地方工作。您至少应该提及这一点,以便将来阅读本文的其他不使用 GNU grep 的人不会浪费时间尝试它。
    • 我没关系,伙计......无论如何,如果你想继续和我争论你的意见,让我们把它移到聊天而不是 cmets
    【解决方案3】:

    根据 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;
    

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多