Există o modalitate de a căuta fișiere PDF folosind puterea grep, fără a converti mai întâi în text în Ubuntu?
Comentarii
- Vezi și Există un fel de convertor PDF către text? și Instrument pentru linia de comandă pentru a căuta expresii într-un număr mare de fișiere pdf .
- Pentru persoanele care vin aici prin căutare: dacă doriți să îl convertiți mai întâi în fișiere text, aveți un uitați-vă la Cum să căutați conținutul mai multor fișiere pdf?
Răspundeți
Instalați pachetul pdfgrep
, apoi utilizați comanda:
find /path -iname "*.pdf" -exec pdfgrep pattern {} +
—— ————
Cel mai simplu mod de a face acest lucru:
pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf
Comentarii
- Acest lucru funcționează și în Mac OSX (Mavericks). Instalați-l folosind brew. Simplu. Mulțumesc.
- Din curiozitate am verificat sursa pdfgrep și folosește poppler pentru a extrage șiruri din pdf. Aproape exact ca răspunsul @wag ‘ numai în pagină, nu, probabil, în întregul document.
- De asemenea,
pdfgrep
are un steag recursiv. Deci, acest răspuns poate fi redus la:pdfgrep -R pattern /path/
. Deși ar putea fi mai puțin eficient dacă trece prin fiecare fișier, chiar dacă nu este ‘ t un PDF. Și observ că are probleme cu personaje internaționale precum å, ä și ö . - De fapt, opțiunea
-n
este un pro pentru pdfgrep, deoarece permite includerea numărului paginii în ieșire (ar putea fi utilă pentru procesarea ulterioară). - Acest răspuns ar fi mai ușor de utilizat dacă s-ar explica care sunt biții comenzii care trebuie să fie copiați literalmente și care sunt substituenți. Ce ‘ s
pattern
Ce ‘ s{}
Ce ‘ se întâmplă cu `+`? Nu am idee la prima lectură … așa că merg pe pagina de manual, presupun.
Răspuns
Dacă aveți instalat poppler-utils
(implicit pe Ubuntu Desktop), îl puteți „converti” din mers și îl puteți ține în grep
:
pdftotext my.pdf - | grep "pattern"
Acest lucru nu va crea un fișier .txt.
Comentarii
- deci .. extrageți textul înainte de a-l grep ceea ce înseamnă că răspunsul este ” nu „.
- @akira PO probabil că a însemnat ” fără a deschide PDF-ul într-un vizualizator și a exporta în text ”
- @akira Unde vedeți ” grep numai „?
- @akira Ei bine, am spus deja ce cred probabil că a vrut să spună; nu ‘ nu vrea să exporte text înainte de al prelucra. Mă îndoiesc că are o problemă cu vreo comandă care să inversează textul în orice mod; ‘ nu există niciun motiv pentru a nu
- @sherrellbc Al doilea argument al
pdftotext
este numele fișierului pe care ar trebui să-l scrie . Cu toate acestea, prin convenție, instrumentele vă permit în mod obișnuit să scrieți lastdout
în loc de un fișier specificând în schimb un-
. În mod similar, unele instrumente ar scrie în mod implicit lastdout
dacă omiteți complet un astfel de argument (dar acest lucru nu este întotdeauna posibil fără a crea ambiguitate).
Răspuns
pdfgrep a fost scris exact în acest scop și este disponibil în Ubuntu.
Încearcă să fie în mare parte compatibil cu grep
și astfel oferă „puterea grep”, specializată doar pentru PDF-uri. Aceasta include opțiuni grep obișnuite, cum ar fi --recursive
, --ignore-case
sau --color
.
Spre deosebire de pdftotext | grep
, pdfgrep poate afișa numărul paginii unei potriviri într-un mod performant și este în general mai rapid atunci când nu trebuie să caute întregul document (de ex. --max-count
sau --quiet
).
Utilizarea de bază este:
pdfgrep PATTERN FILE..
unde PATTERN
este șirul dvs. de căutare și FILE
o listă de nume de fișiere (sau metacaractere într-un shell).
Răspuns
Nu
Un pdf constă din bucăți de date, unele dintre ele text, unele dintre ele imagini și unele dintre ele cu fantezie XYZ cu adevărat magică (de exemplu, fișiere .u3d). bucăți sunt de cele mai multe ori comprimate (de exemplu, plat, bifați http://www.verypdf.com/pdfinfoeditor/compression.htm ). Pentru a „grep” un . pdf aveți pentru a inversa compresia, de asemenea, extrage textul.
Puteți face acest lucru fie pe fișier cu instrumente precum pdf2text
și grep rezultatul, fie rulați un „indexer” (uitați-vă la xapian.org sau lucene ) care construiește un index care poate fi căutat din fișierele dvs. .pdf și apoi puteți utiliza instrumente pentru motoarele de căutare ale acelui indexer pentru a obține conținutul fișierului pdf.
Dar nu, nu puteți grep
fișiere pdf și spera la răspunsuri fiabile fără a extrage textul mai întâi.
Comentarii
- Având în vedere că
pdfgrep
există (vezi mai sus), un ” nu ” este incorect. - @JonathanCross, având în vedere întrebarea spune ” folosind puterea grep, fără a converti mai întâi la text „, un ” nu ” este corect.
Răspuns
Recoll poate căuta fișiere PDF. Nu acceptă expresii regulate, dar are o mulțime de alte opțiuni de căutare, deci s-ar putea potrivi nevoilor dvs.
Răspuns
Există o întrebare duplicat pe StackOverflow. Persoanele de acolo sugerează o variantă a răspunsului harish.venkarts:
find /path -name "*.pdf" -exec sh -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"" \;
Avantajul față de răspunsul similar aici este --with-filename
semnalizator pentru grep. Acest lucru este oarecum superior și pdfgrep, deoarece grep-ul standard are mai multe caracteristici.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Comentarii
- Cred că ar fi fost mai bine să lăsați acest lucru ca un comentariu (sau editare) în răspunsul similar la care vă referiți.
Răspuns
Aruncați o privire la instrumentul grep de resurse comune crgrep care acceptă căutarea în fișiere PDF.
De asemenea, permite căutarea altor resurse, cum ar fi conținutul imbricat în arhive, baze de date Mese , metadate de imagine, dependențe de fișiere POM și resurse web – și combinații ale acestora, inclusiv căutare recursivă.
Răspuns
Ați putea introduceți-l prin strings
mai întâi: –
cat file.pdf | strings | grep <...etc...>
Comentarii
- Pur și simplu utilizați
strings file.pdf | grep <...>
, nu aveți ‘ nu aveți nevoie decat
- Da – mintea mea pare să funcționeze mai bine cu fluxurile … 🙂
- nu va funcționa dacă textul este comprimat, ceea ce este de cele mai multe ori.
- Chiar dacă textul este necomprimat, ‘ este, în general, mici bucăți de propoziții (nici măcar neapărat cuvinte întregi!) fin amestecate cu informații de formatare. Nu prea prietenos pentru
strings
saugrep
. - Vă puteți gândi la un alt motiv pentru care utilizarea șirurilor pentru acest lucru nu ‘ nu funcționează? Am constatat că folosirea șirurilor funcționează pe unele PDF-uri, dar nu pe altele.
Răspuns
încercați acest lucru
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done
pentru imprimarea liniilor, modelul apare în pdf
Răspuns
Iată un script rapid pentru căutarea pdf în directorul curent:
#!/bin/bash if [ $# -ne 1 ]; then echo "usage $0 VALUE" 1>&2 exit 1 fi echo "SEARCH IS CASE SENSITIVE" 1>&2 find . -name "*.pdf" -exec /bin/bash -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"" "$1" \;
Comentarii
- Nu pot edita acest lucru din cauza faptului că este puțin:
$1
din invocația de căutare ar trebui să fie citat, altfel acest lucru nu va funcționa ‘ termeni cu spații. - @ankon l-a remediat 🙂
Răspunde
cd la dosarul care conține fișierul pdf și apoi ..
pdfgrep "pattern" your.pdf
sau dacă doriți să căutați în mai mult de un singur fișier pdf (de exemplu, în toate fișierele pdf- fișiere din dosarul dvs.)
pdfgrep "pattern" `ls *.pdf`
sau
pdfgrep "pattern" $(ls *.pdf)
Comentarii
- de ce pe pământ folosiți ls pentru a pune nume de fișiere în parametri? ‘ nu numai că este mai lent, ci și o idee proastă de a utiliza
ls
ieșire ca introducerea la alte comenzi . Doarpdfgrep 'pattern' *.pdf
este suficient - @phuclv Sunteți greșit.
pdfgrep 'pattern' *.pdf
nu va funcționa. - @ f0nzie ‘ greșești.
$(ls *.pdf)
va fi aproape exact la fel ca*.pdf
, dar mai rău, deoarece special fișierele nu sunt protejate între ghilimele
Răspuns
Presupun că vrei să spui că nu-l convertești pe disc, tu le poate converti în stdout
și apoi grep-l cu pdftotext
. Grepping-ul pdf fără niciun fel de conversie nu este o abordare practică, deoarece PDF
este în mare parte un format binar.
În director:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
sau în director și subdirectoarele sale:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
De asemenea, deoarece unele pdf
sunt scanări, trebuie mai întâi să fie OCR. Am scris o modalitate destul de simplă de a căuta toate fișierele pdf care nu pot fi grep
editate și OCR le.
Am observat dacă un pdf
nu are niciun font, de obicei nu este căutabil. Deci, știind acest lucru putem folosi pdffonts
.
Primele 2 linii ale pdffonts
sunt antetul tabelului, deci atunci când un fișier poate fi căutat are mai mult de două ieșiri de linie, știind acest lucru putem crea:
gedit check_pdf_searchable.sh
apoi lipiți acest
#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi
apoi faceți executabil
chmod +x check_pdf_searchable.sh
apoi listați toate pdf-uri care nu pot fi căutate în director:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
sau în director și subdirectoarele sale:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Răspuns
Dacă doriți doar să căutați nume / proprietăți pdf … sau șiruri simple care nu sunt comprimate sau codificate, atunci în loc de strings
puteți utiliza cele de mai jos
grep -a STRING file.pdf cat -v file.pdf | grep STRING
Din grep --help
:
--binary-files=TYPE assume that binary files are TYPE; TYPE is "binary", "text", or "without-match" -a, --text equivalent to --binary-files=text
și cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
Răspuns
gpdf ar putea fi ceea ce aveți nevoie dacă utilizați Gnome ! Verificați în cazul în care nu utilizați Gnome. Are o listă de vizualizatori PDF CLI. Apoi puteți utiliza grep
pentru a găsi un anumit model.
Răspuns
pdfgrep -r --include "*.pdf" -i "pattern"
Comentarii
- Bine ați venit pe site și vă mulțumim tu pentru contribuția ta. Ați putea adăuga câteva explicații despre ce înseamnă aceste opțiuni? Acest lucru ar putea ajuta, de asemenea, să explice modul în care abordarea dvs. diferă de alte răspunsuri la această întrebare, care recomandă și
pdfgrep
.
Răspuns
Cel mai rapid mod este
grep -rinw "pattern" --include \*.pdf *
Comentarii
- Bun venit pe site. V-ar deranja să adăugați mai multe explicații la soluția propusă pentru a o face mai accesibilă pentru non-expert? De exemplu,
grep
din linia de comandă caută recursiv în subdirectoare de care cineva care nu este familiarizat cugrep
ar putea să nu știe. De asemenea, ați inclus marcajul-i
, deși ignorarea cazului nu poate fi întotdeauna ceea ce dorește utilizatorul. În plus, vă rugăm să explicați în ce mod diferă abordarea dvs. de răspunsul de ex. @phuclv ș.a. Nici opțiunile-n
și-w
nu sunt justificate de întrebare. Dar, mai important, acest răspuns vă arată cum să căutați prin fișiere text ale căror nume se termină cu.pdf
– ați pierdut ideea întrebării.
Răspuns
less mypdf.pdf | grep "Hello, World"