파일 로딩 오류 시 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종료 코드를 통해 변환이 발생하지 않았음을 알려줄 것입니다. 하지만꼭 그렇지는 않은 것 같습니다.

따라서 최소한 두 가지 옵션이 있습니다. 하나는 표준 오류를 구문 분석하고 오류 메시지가 존재하지 않는 경우에만 파일을 삭제하는 것입니다(종료 코드를 확인 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

관련 정보