我通过文件管理器上下文菜单使用脚本将各种文档格式(例如 *.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