如何使 libreoffice 无头转换在文件加载错误时表现不同

如何使 libreoffice 无头转换在文件加载错误时表现不同

我通过文件管理器上下文菜单使用脚本将各种文档格式(例如 *.DOC)转换为 ODT 格式,如下所示:

for filename in "${@}"; do
    if [[ -f "${filename%.*}.odt" ]]
    then
        newfile="${filename%.*}_$(stat "$filename" | grep "Modify" | awk -F " " '{print $2}').odt"
        mv "${filename%.*}.odt" "${filename%.*}.tmp"
        libreoffice --headless --convert-to odt "$filename"
        mv "${filename%.*}.odt" "$newfile"
        touch "$newfile" -r "$filename"
        mv "${filename%.*}.odt.tmp" "${filename%.*}.odt"
        rm "$filename"
    else
        libreoffice --headless --convert-to odt "$filename"
        touch "${filename%.*}.odt" -r "$filename"
        rm "$filename"
    fi
done

不幸的是,如果文件受密码保护,这会导致在未转换的情况下删除文件。

在这种情况下,终端输出为“错误:无法加载源文件”

我想(并且希望)需要多一点 shell 脚本编写技能来改进上面的非常基本的脚本,以便输入文件不会被删除,而是简单地被跳过(可能还有错误消息或日志文件)。

答案1

在理想的情况下,libreoffice会通过退出代码让您知道转换没有发生。但看来事实并非如此

因此,您至少有两种选择,一种是解析标准错误,并仅在错误消息不存在时才删除文件(您检查退出代码grep并希望管道在此之前不会被破坏):

for filename in "${@}"; do
    libreoffice --headless --convert-to odt "$filename" 2>&1 | grep "source file could not be loaded" || rm "$filename"
done

另一种可能性是在删除源之前检查 odt 文件是否已创建(不完整的转换可能会触发删除)。像这样的东西:

for filename in "${@}"; do
    libreoffice --headless --convert-to odt "$filename"
    test -f ${filename%.*}.odt && rm "$filename"
done

相关内容