최근에 파일 디렉토리를 인쇄하는 명령을 클릭했습니다 pdf
.
mutool show file.pdf outline
epub
위 형식과 비슷하게 사용법이 간단하고 좋은 결과를 내는 명령을 사용하고 싶습니다 pdf
.
그런 게 있나요?
답변1
.epub
파일은 .zip
XHTML 및 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에 있습니다.
xml2
Debian, Ubuntu 및 기타 Debian 파생 제품은 물론 대부분의 다른 Linux 배포판용으로 사전 패키지될 수 있습니다.
sed
이와 같은 간단한 작업의 경우(즉 , awk
, cut
, 등과 함께 사용하기 위해 XML을 행 기반 형식으로 변환하려는 경우 grep
) .xml2
xmlstarlet
그런데, 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-type
application/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에서 헤더가 누락되었지만).