많은 pdf 파일에서 문구를 검색하는 명령 줄 도구 pdf 파일에서 문구를 검색하는

Opensuse 10.3을 사용하고 디렉토리 내의 많은 pdf 파일에서 문구를 검색하는 명령 줄 도구를 알고 싶습니다. Windows XP의 경우 탐색기 검색에서이를 허용하지만 너무 느립니다. 그렙 팁이 있습니까?



답변

SEARCH_DIR = "/ some / dir / where / you / want / to / search /";
SEARCH_STRING = "무엇이든 검색 중";
# pdf에서 텍스트 추출
pdftotext "file.pdf" "file.txt"

# grep과 연결
pdftotext "file.pdf"/ dev / stdout | grep -H --label = "file.pdf"- "$ SEARCH_STRING"

# grep이 일치하는 pdf 파일의 파일 목록 만 표시하도록하려면 --files-with-matches를 추가하십시오.
pdftotext "file.pdf"/ dev / stdout | grep -H --label = "file.pdf"-일치하는 파일- "$ SEARCH_STRING"

# 검색 가능한 PDF 목록을 찾으십시오.
"$ SEARCH_DIR"찾기 -type f -name '* .pdf'> list-of-pdf.txt
# awk와 덕트 테이프로 결합 된 모든 것, 처리를 위해 bash로 전송
# 큰 따옴표는 awk 내부 x22로 이스케이프됩니다.
"$ SEARCH_DIR"찾기 -type f -name '* .pdf'| awk -v SEARCH_STRING = "$ SEARCH_STRING" '{
"pdftotext \ x22"$ 0 "\ x22 / dev / stdout | grep -H --label = \ x22"$ 0 "\ x22-\ x22"SEARCH_STRING "\ x22"인쇄
} '| bash

# bash없이. 필요에 맞는 추가 프로세스
"$ SEARCH_DIR"찾기 -type f -name '* .pdf'| awk -v SEARCH_STRING = "$ SEARCH_STRING" '
{
EXEC = "pdftotext \ x22"$ 0 "\ x22 / dev / stdout | grep -H --label = \ x22"$ 0 "\ x22-\ x22"SEARCH_STRING "\ x22";
while (EXEC | getline ret) {
 print "파일 ["$ 0 "]의 경우 ["ret "]"와 일치합니다.
 # 원하는대로하세요.
};
닫기 (EXEC);
} '


답변

Linux 및 Windows 모두에서 여러 파일을 검색하는 명령이있는 Acrobat Reader를 사용할 수 있습니다.

Linux에는 Recoll이 있으며, 처음 실행할 때 pdf 파일의 색인을 작성합니다. 색인이 작성되면 단어 검색이 매우 빨라야합니다. 구문 검색은 합리적이어야합니다. pdftotextRecoll을 시작하기 전에 명령이 설치되어 있는지 확인하십시오 . 데비안과 우분투에서 poppler-utils패키지에 들어 있습니다. 수세에 대해서는 모르겠습니다.

또는 파일을 텍스트로 직접 변환하고 아래 명령으로 텍스트 파일에 grep을 사용할 수 있습니다.

찾기 -name '* .pdf'-exec pdftotext {} \;
grep -r --include '* .txt'-l -F "검색 할 정확한 구"
grep -r --include '* .txt'-l -E "검색 할 정규식"


답변

어도비 리더 X는 작업을 수행하고 그것을 수행 뿐만 아니라 파일 내부에, 전체 디렉토리 및 하위 디렉토리에서 검색을 허용하지만 명령 줄 프로그램이 아닙니다.


답변

PDF 파일 확장자를 가지며 정규 표현식 ‘ [iI]n Haskell‘ 과 일치하는 행을 포함하는 홈 디렉토리의 모든 파일을 재귀 적으로 나열하려면 다음을 발행하십시오.

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

비고 :

  • 이 예에 특히 필요는 없습니다 만, 내가 사용 방지이 건설 한 -execxargs때문에 보안상의 이유로 , 나는 그것의 좋은 연습은 그렇게하는 습관을 얻을 수 있다고 생각합니다. ‘ -execdir‘에서 ‘ -exec‘및 ‘ $PWD${0#?}‘에서 ‘ ‘를 변경하면 $0이 인스턴스에서 동일한 결과를 얻을 수 있습니다.
  • 파일 이름을 패턴 일치하는 데 glob 을 사용하는 대신 정규 표현식의 표현력을 높이고 전체 경로를 패턴 일치하는 것이 유용 할 수 있습니다 . 나는 그것을 수행하는 방법을 보여주기 위해 연습을 여기에 포함시켰다. 패턴과 일치하는 경로는 일반적으로 인쇄되는 경로입니다. 상대 경로인지 절대 경로인지는 주어진 경로 인수에 따라 달라지며, 기본 경로는 현재 작업 디렉토리 ( ‘ ./‘)로 내 보냅니다. 이 예에서, /~/‘가 현재 사용자의 홈 디렉토리의 절대 경로로 확장되고 유일한 경로 인수 이므로 일치하는 경로는 모두 절대입니다 (예 : ‘ ‘로 시작 ) 입니다.
  • $0‘및 ‘ $1‘는 인수를 올바르게 인용하는 방식으로 사용되는 위치 매개 변수입니다. 이를 제대로 수행하지 않으면 명령이 임의의 파일 이름에 취약합니다.
  • ${0#?}‘의 첫 번째 문자 스트립 $0, IE의 ‘을 .‘.

파일 이름에 따라 일치하는 각 줄을 인쇄하려면

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

이 변형은 ‘ -H‘대신 ‘ ‘를 사용 -l하고 파일 경로가 아닌 파일 이름을 가진 레이블을 사용합니다. ‘ ${0:2}‘는 ‘ ‘의 첫 두 문자 $0, 즉 ‘ ./‘를 제거하지만 분명히 인식하지 못합니다 sh.

물론 필요에 따라 조정하십시오.


답변