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

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 la stdout în loc de un fișier specificând în schimb un -. În mod similar, unele instrumente ar scrie în mod implicit la stdout 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).

Consultați pagina de manual pentru mai multe informații.

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 de cat
  • 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 sau grep.
  • 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 . Doar pdfgrep '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 cu grep 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" 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *