Shell-Script
如何使 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 腳本技能來改進上面的非常基本的腳本,這樣輸入文件就不會被刪除,而只是被跳過(可能還有錯誤消息或日誌文件)。
在理想的世界
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