Opensuse 10.3을 사용하고 디렉토리 내의 많은 pdf 파일에서 문구를 검색하는 명령 줄 도구를 알고 싶습니다. Windows XP의 경우 탐색기 검색에서이를 허용하지만 너무 느립니다. 그렙 팁이 있습니까?
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 파일의 색인을 작성합니다. 색인이 작성되면 단어 검색이 매우 빨라야합니다. 구문 검색은 합리적이어야합니다. pdftotext
Recoll을 시작하기 전에 명령이 설치되어 있는지 확인하십시오 . 데비안과 우분투에서 poppler-utils
패키지에 들어 있습니다. 수세에 대해서는 모르겠습니다.
또는 파일을 텍스트로 직접 변환하고 아래 명령으로 텍스트 파일에 grep을 사용할 수 있습니다.
찾기 -name '* .pdf'-exec pdftotext {} \; grep -r --include '* .txt'-l -F "검색 할 정확한 구" grep -r --include '* .txt'-l -E "검색 할 정규식"
pdftotext
됩니다 (Recoll과 같은 도구는 자동으로 수행됩니다).
PDF 파일 확장자를 가지며 정규 표현식 ' [iI]n Haskell
' 과 일치하는 행을 포함하는 홈 디렉토리의 모든 파일을 재귀 적으로 나열하려면 다음을 발행하십시오.
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;
비고 :
-exec
나 xargs
때문에 보안상의 이유로 , 나는 그것의 좋은 연습은 그렇게하는 습관을 얻을 수 있다고 생각합니다. ' -execdir
'에서 ' -exec
'및 ' $PWD${0#?}
'에서 ' '를 변경하면 $0
이 인스턴스에서 동일한 결과를 얻을 수 있습니다../
')로 내 보냅니다. 이 예에서, /
' ~/
'가 현재 사용자의 홈 디렉토리의 절대 경로로 확장되고 유일한 경로 인수 이므로 일치하는 경로는 모두 절대입니다 (예 : ' '로 시작 ) 입니다.$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
.
물론 필요에 따라 조정하십시오.