ファイルロードエラーで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

残念ながら、ファイルがパスワードで保護されている場合、ファイルは変換されずに削除される可能性があります。

この場合、ターミナル出力は「エラー:ソースファイルをロードできません」です。

入力ファイルが削除されずに単純にスキップされるように(エラーメッセージやログファイルも可能です)、上記の非常に基本的なスクリプトを改善するには、シェルスクリプト技術がもう少し必要であると想像してください(そして希望)。

ベストアンサー1

理想的な状況では、libreoffice終了コードで変換が発生していないことをお知らせします。しかし、必ずしもそうではないようです

したがって、少なくとも2つのオプションがあります。 1つは、標準エラーを解析し、エラーメッセージが存在しない場合にのみファイルを削除することです(終了コードを確認し、grepその前にパイプが破壊されないことを願っています)。

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

もう1つの可能性は、ソースを削除する前にodtファイルが作成されたことを確認することです(不完全な変換によって削除が発生する可能性があります)。このような:

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

おすすめ記事