epub 파일을 추출할 디렉터리

epub 파일을 추출할 디렉터리

최근에 파일 디렉토리를 인쇄하는 명령을 클릭했습니다 pdf.

mutool show file.pdf outline

epub위 형식과 비슷하게 사용법이 간단하고 좋은 결과를 내는 명령을 사용하고 싶습니다 pdf.

그런 게 있나요?

답변1

.epub파일은 .zipXHTML 및 CSS뿐만 아니라 이미지, 다양한 메타데이터 파일 및 toc.ncx포함 디렉터리라고 하는 XML 파일을 포함한 기타 파일을 포함하는 파일입니다.

다음 스크립트는 stdout으로 unzip -p추출 toc.ncx하고 파이프하는 데 사용됩니다.XML2명령을 실행한 다음 sed각 장 제목의 텍스트만 추출합니다.

명령줄에서 하나 이상의 파일 이름 인수를 허용합니다.

#! /bin/sh

# This script needs InfoZIP's unzip program
# and the xml2 tool from http://ofb.net/~egnor/xml2/
# and sed, of course.

for f in "$@" ; do
    echo "$f:"
    unzip -p "$f" toc.ncx | 
        xml2 | 
        sed -n -e 's:^/ncx/navMap/navPoint/navLabel/text=:  :p'
    echo
done

epub라는 파일 이름과 그 뒤에 epub가 출력되고 :, 다음 줄에서 각 장 제목을 공백 두 개로 들여쓰기합니다. 예를 들어:

book.epub:
  Chapter One
  Chapter Two
  Chapter Three
  Chapter Four
  Chapter Five

book2.epub:
  Chapter One
  Chapter Two
  Chapter Three
  Chapter Four
  Chapter Five

epub 파일이 포함되어 있지 않으면 toc.ncx해당 특정 도서에 대해 다음과 같은 출력이 표시됩니다.

book3.epub:
caution: filename not matched:  toc.ncx
error: Extra content at the end of the document

첫 번째 오류 줄은 에서 나오고 unzip두 번째 오류 줄은 에서 나옵니다 xml2. 또한 잘못된 형식의 파일 xml2과 같이 발견된 다른 오류에 대해서도 경고합니다 .toc.ncx

오류 메시지는 stderr에 있지만 책의 파일 이름은 여전히 ​​stdout에 있습니다.

xml2Debian, Ubuntu 및 기타 Debian 파생 제품은 물론 대부분의 다른 Linux 배포판용으로 사전 패키지될 수 있습니다.

sed이와 같은 간단한 작업의 경우(즉 , awk, cut, 등과 함께 사용하기 위해 XML을 행 기반 형식으로 변환하려는 경우 grep) .xml2xmlstarlet

그런데, epub의 제목도 인쇄하려면 sed스크립트를 다음과 같이 변경하세요.

sed -n -e 's:^/ncx/navMap/navPoint/navLabel/text=:  :p
           s!^/ncx/docTitle/text=!  Title: !p'

또는 스크립트로 바꾸십시오 awk.

awk -F= '/(navLabel|docTitle)\/text/ {print $2}'

답변2

@cas가 제공한 답변이 어떤 경우에는 효과가 있지만 이는 epub 버전 2.0 및 NCX 문서의 toc.ncx이름이 zip 컨테이너의 최상위 수준에 있다는 가정을 기반으로 합니다. 폴더에 있는 223개의 epub 중 단 5개만이 여전히 이 가정을 충족하며 이러한 epub에는 이전 리더 시스템과의 호환성을 위해서만 포함됩니다. 이것은 toc.ncx필수 파일이 아닙니다 META-INF/content.xml. 필수 파일은 epub의 다른 모든 요소에 대한 포인터를 포함합니다. 이로 인해 bash를 통한 스크립팅이 좀 더 복잡해졌지만 가능합니다. 다음은 opf 파일(content.xml이 가리키는)에서 제목과 작성자를 추출하는 스크립트입니다.

#! /bin/sh

for f in "$@" ; do
    echo -n "$f""   "
    opf=$(unzip -p "$f" META-INF/container.xml | 
        xml2 | 
        sed -n -e 's:^/container/rootfiles/rootfile/@full-path=::p')
    unzip -p "$f" "$opf" |
        xml2 |
        sed -n -e 's!^/package/metadata/dc:title=!  !p' | tr  '
' ' '
    unzip -p "$f" "$opf" |
        xml2 |
        sed -n -e 's!^/package/metadata/dc:creator=!    !p' | tr  '
' ' '
    echo
done

예, opf결과의 순서를 확인하기 위해 두 번 구문 분석합니다. 이렇게 하면 스프레드시트 가져오기에 적합한 탭으로 구분된 3열 파일(두 앞머리 사이의 sed 줄에 있는 탭)이 생성됩니다.

ncx 파일을 한 단계 더 찾는 것은 약간 까다롭습니다. 왜냐하면 xml2를 사용하여 각 태그 및 속성에 대한 행을 생성하는 것이 우리에게 불리하게 작용하기 때문입니다. 우리는 href속성과 동일한 속성의 값이 필요합니다. 약간의 속임수를 써서 원래 항목이 모두 한 줄에 있기를 바랐다가 grep을 사용하여 해당 조각을 추출한 다음 xml2로 처리하여 href 값을 얻을 수 있습니다.media-typeapplication/x-dtbncx+xml

이는 상대 URL이므로 opf 항목에서 경로 부분도 추출해야 합니다. 그것들을 합치면 다음과 같은 결과를 얻을 수 있습니다.

#! /bin/sh

for f in "$@" ; do
    echo "$f""  "
    opf=$(unzip -p "$f" META-INF/container.xml | 
        xml2 | 
        sed -n -e 's:^/container/rootfiles/rootfile/@full-path=::p')
    ncx=$(unzip -p "$f" "$opf" |
        grep application/x-dtbncx+xml| 
        xml2 |
        sed -n -e 's!^/item/@href=!!p')
    opf_filename=${opf##*/}
    opf_path=${opf%$opf_filename}
    unzip -p "$f" ${opf_path}${ncx} |
        xml2 |
        sed -n -e 's:^/ncx/navMap/navPoint/navLabel/text=:  :p
                   s!^/ncx/docTitle/text=!Title: !p'
done

이것은 여전히 ​​가정을 하고 있는데, 가장 강력한 것은 이것이 epub2 호환 파일이므로 어딘가에 ncx 파일이 포함되어 있다는 것입니다. Epub3 문서는 다른 HTML 기반 탐색 형식을 사용합니다. 그럼에도 불구하고 나는 모든 223개의 테스트 파일에 대한 디렉토리를 얻었습니다(일부는 ncx에서 헤더가 누락되었지만).

관련 정보