특정 드라이브에 있는 여러 PDF 파일에서 특정 단어를 검색(grep/find)하는 방법이 있습니까?

특정 드라이브에 있는 여러 PDF 파일에서 특정 단어를 검색(grep/find)하는 방법이 있습니까?

8000개 이상의 PDF 파일과 수백 개의 폴더가 포함된 외부 백업 드라이브에 저장된 고객 PDF 파일을 찾으려고 합니다.

예를 들어, X 드라이브에서 내 고객 이름 "Sequoia Group"이 포함된 모든 PDF 파일을 검색하려는 경우 관련 출력을 얻는 데 유용한 명령줄 및/또는 도구는 무엇입니까?

저는 zsh와 함께 MacOS High Sierra를 사용하고 있으며 homebrew를 통해 GNU grep, ack 및 pdfgrep도 설치했습니다. 그런데 아직 파일을 찾지 못했습니다.

모든 파일이 PDF-Backup-0001, PDF-Backup-0002...등으로 저장되어 있어서 파일 이름을 알 수 없습니다.

지금까지 나는 성공하지 못한 채 다음 명령을 사용했습니다.

#grep -wirl "sequoia group" ./

#pdfgrep -iHncRZ "sequoia group"

#mdfind "sequoia group"

또한 이 명령줄이 제안되었지만 이름을 어디에 입력해야 할지 확신이 없어서 /path를 드라이브 경로로 바꾸고 패턴을 "sequoia"로 바꿨지만 여전히 일치하는 항목을 찾을 수 없습니다.

#find /path -iname '*.pdf' -exec pdfgrep pattern {} + 
#find /Volumes/X Backup -iname '*.pdf' -exec pdfgrep "sequoia" {} + 

답변1

아, 왜 이렇게 낯익어 보이는지...

검색 디렉토리의 루트에서 터미널을 열고

pdfgrep -ril  "sequoia group" >matches 2>bad.files

그러면 -r검색어에 대해 모든 PDF 파일을 재귀적으로 검색하여 대소문자를 구분하지 않고 -i일치하는 텍스트가 아닌 파일 이름만 반환합니다 -l.

일치하는 모든 파일 이름은 이라는 파일에 기록되고 matches오류는 이라는 파일에 기록됩니다 bad.files.

matches참조용으로 별도의 디렉터리에 복사할 수 있습니다 .

while read f do; cp $f /wherever/I/want/$f; done < matches

손상 되었거나 bad.filesOCR이 잘못되었으므로 다른 디렉토리에 복사하여 재처리한 후 다시 검색해야 합니다.

find아마도 변형 pdf등이 PDF있어서 서두르신다면

find /search/root/ -iname *.pdf -exec pdfgrep -il "sequoia group" {} ';' >matches 2>bad.files

위에서 이것에 대한 설명을 요청하셨습니다. find귀하가 받은 명령은 pdfgrep리디렉션과 마찬가지로 위에 설명되어 있다고 생각합니다 >.

옵션은 명령 의 출력을 -exec가져와 사용자가 볼 수 있는 곳에 저장합니다 .findfind{}

결국 -exec당신은 내가 놓아주고 ;당신도 놓아주었다는 것을 알게 될 것입니다 +.

+-exec모든 출력을 수집하여 긴 인수 목록으로 전달하고 pdfgrep을 한 번 실행합니다 find. pdfgrep파일 수가 최대값을 초과하지 않는 한 제대로 작동합니다.

;-exec출력이 find한 번에 하나의 파일에 제공 됩니다 .pdfgrep

추신. PDF 파일을 어떻게 보든 열어서 OCR 처리되었는지, 실제로 검색 가능한지 확인하세요.

그렇지 않은 경우 각 디렉터리에서 실행해야 할 수도 있습니다.

find /path/to/dir/ -maxdepth 1 -type f -iname "*.pdf" -print0 | while IFS= read -r -d $'\0' line; do pdfsandwich -lang eng "$line"; done

시간이 얼마나 걸리더라도 컴퓨터를 8,000개의 파일을 모두 처리하는 데 전념할 수 있다면 검색 루트를 삭제 -maxdepth 1하고 지정하기 만 하면 됩니다.find

답변2

첫째, @Motivated가 댓글에서 질문한 대로 PDF가 종이 문서를 스캔하여 생성됩니까, 아니면 일부 프로그램(LibreOffice, Tex/LaTeX, MS Word 등)에 의해 생성됩니까? 스캔한 문서인 경우 이러한 방법은아니요작업: 이미지를 검색할 수 있는 텍스트로 변환하려면 OCR 프로그램이 필요합니다. 이는 이 답변의 범위를 벗어나는 주요 프로젝트일 수 있습니다. 다음에서는 이러한 PDF가 일부 워드 프로세싱(또는 유사한) 프로그램에 의해 생성되었다고 가정합니다. 특히 pdfgrep이러한 파일을 효율적으로 처리할 수 있다고 가정합니다.

두 가지가 필요합니다.

  • 디렉터리 계층 구조를 탐색하고 계층 구조에서 일치하는 모든 파일을 찾아 찾은 각 파일에 대해 일부 작업을 수행하는 프로그램입니다. 그게 다야 find. 예를 들어 다음과 find /path/to/some/directory -type f -name 'PDF-Backup-*'같이 말하면 이름이 다음으로 시작하는 모든 일반 파일( ) find을 찾을 수 있습니다.-type fPDF-Backup- 어딘가에주어진 경로에서 /path/to/some/directory - 기본 동작은 발견된 각 파일의 경로 이름을 인쇄하는 것입니다.

  • 관심 있는 파일을 모두 찾았으면 각 파일에서 주어진 문자열을 검색하는 프로그램이 필요합니다. pdfgrep여기에서는 작동하지만(위에서 논의한 스캔 파일 범주에 속하지 않는다는 가정하에) 몇 가지 옵션을 제공합니다: -i파일에서 대소문자를 구분하지 않고 패턴을 검색하므로 , 등은 대소 문자에 관계없이 pdfgrep -i sequia발견됩니다 .sequoiaSequioaSEQUOIASeQuOiA진짜파일의 철자가 어떻게 되는지 확인하면 대소문자를 구분하지 않고 검색하면 너무 많은 오탐지가 생성됩니다. 필요한 또 다른 옵션은 -H일치하는 항목이 발견된 파일 이름을 인쇄하는 것입니다[fn:1].

이제 두 가지를 결합할 수 있습니다. 호출 find하여 계층 구조를 탐색하고 기준과 일치하는 모든 파일을 찾습니다. 그러나 기본 작업(파일 이름 인쇄)을 사용하여 찾은 모든 파일에 대해 작업을 수행하는 대신 다른 작업을 수행하도록 요청합니다. pdfgrep다음 -exec옵션을 사용하여 모든 파일을 검색 할 수 있습니다 find.

find /path/to/some/directory -type f -name 'PDF-Backup-*' -exec pdfgrep -i -H sequoia '{}' \; 

구문은 약간 모호합니다. {}call 에서 찾은 각 파일로 대체되지만 pdfgrep중괄호는 종종 쉘에서 특별한 의미를 갖기 때문에 중괄호 쌍을 따옴표로 묶어야 합니다. 또한 ;인수로 사용되는 명령은 종료되지만 -exec쉘에 특별한 의미가 있으므로 따옴표로 묶어야 합니다. 이 경우 단순히 더 짧기 때문에 두 개의 따옴표 대신 단일 백슬래시를 사용합니다. 표시된 대로 정확하게 입력하십시오.

[fn:1] 두 개 이상의 파일을 검색하는 경우 기본적으로 파일 이름이 인쇄되지만 pdfgrep위의 마지막 글머리 기호와 결합하면 pdfgrep각 파일이 별도로 호출되므로 기본적으로 파일 이름이 인쇄되지 않습니다. 이것이 필요한 이유입니다.findpdfgrep-H

관련 정보