Shell-Script

如何使 libreoffice 無頭轉換對文件載入錯誤有不同的作用

  • May 15, 2022

我通過文件管理器上下文菜單使用腳本將各種文件格式(例如 *.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 腳本技能來改進上面的非常基本的腳本,這樣輸入文件就不會被刪除,而只是被跳過(可能還有錯誤消息或日誌文件)。

在理想的世界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

引用自:https://unix.stackexchange.com/questions/702155