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.files
OCR이 잘못되었으므로 다른 디렉토리에 복사하여 재처리한 후 다시 검색해야 합니다.
find
아마도 변형 pdf
등이 PDF
있어서 서두르신다면
find /search/root/ -iname *.pdf -exec pdfgrep -il "sequoia group" {} ';' >matches 2>bad.files
위에서 이것에 대한 설명을 요청하셨습니다. find
귀하가 받은 명령은 pdfgrep
리디렉션과 마찬가지로 위에 설명되어 있다고 생각합니다 >
.
옵션은 명령 의 출력을 -exec
가져와 사용자가 볼 수 있는 곳에 저장합니다 .find
find
{}
결국 -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 f
PDF-Backup-
어딘가에주어진 경로에서/path/to/some/directory
- 기본 동작은 발견된 각 파일의 경로 이름을 인쇄하는 것입니다.관심 있는 파일을 모두 찾았으면 각 파일에서 주어진 문자열을 검색하는 프로그램이 필요합니다.
pdfgrep
여기에서는 작동하지만(위에서 논의한 스캔 파일 범주에 속하지 않는다는 가정하에) 몇 가지 옵션을 제공합니다:-i
파일에서 대소문자를 구분하지 않고 패턴을 검색하므로 , 등은 대소 문자에 관계없이pdfgrep -i sequia
발견됩니다 .sequoia
Sequioa
SEQUOIA
SeQuOiA
진짜파일의 철자가 어떻게 되는지 확인하면 대소문자를 구분하지 않고 검색하면 너무 많은 오탐지가 생성됩니다. 필요한 또 다른 옵션은-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
각 파일이 별도로 호출되므로 기본적으로 파일 이름이 인쇄되지 않습니다. 이것이 필요한 이유입니다.find
pdfgrep
-H