次のように、ファイルマネージャのコンテキストメニューを使用してスクリプトを使用して、さまざまなドキュメント形式(*.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