Er det en måte å søke i PDF-filer ved å bruke kraften til grep, uten å konvertere til tekst først i Ubuntu?

Kommentarer

Svar

Installer pakken pdfgrep, og bruk deretter kommandoen:

find /path -iname "*.pdf" -exec pdfgrep pattern {} + 

—— ————

Enkleste måte å gjøre det på:

pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf 

Kommentarer

  • Dette fungerer også i mac osx (Mavericks). Installer den med brygge. Enkel. Takk.
  • Av nysgjerrighet sjekket jeg kilden til pdfgrep, og den bruker poppler for å trekke ut strenger fra pdf. Nesten nøyaktig som @wag ‘ bare svarer sidevis i stedet for, antagelig, hele dokumentet.
  • pdfgrep har et rekursivt flagg. Så dette svaret kan kanskje reduseres til: pdfgrep -R pattern /path/. Selv om det kan være mindre effektivt hvis det går gjennom hver fil, selv om det ikke er ‘ t en PDF. Og jeg merker at det har problemer med internasjonale tegn som å, ä og ö .
  • Egentlig er alternativet -n et proff for pdfgrep, da det gjør det mulig å inkludere sidenummeret i utdataene (kan være nyttig for videre behandling).
  • Dette svaret vil være enklere å bruke hvis det forklares hvilke biter av kommandoen som er ment å kopieres bokstavelig og hvilke som er plassholdere. Hva ‘ s pattern? Hva ‘ s {}? Hva ‘ skjer med `+`? Jeg aner ikke ved første lesning … så jeg går ut på hjemmesiden.

Svar

Hvis du har poppler-utils installert (standard på Ubuntu Desktop), kan du «konvertere» den på farten og pipe den til grep :

pdftotext my.pdf - | grep "pattern" 

Dette oppretter ikke en .txt-fil.

Kommentarer

  • så .. du trekker ut teksten før du tar tak i den, noe som betyr at svaret er » nei «.
  • @akira OP mente sannsynligvis » uten å åpne PDF-en i en visningsprogram og eksportere til tekst »
  • @akira Hvor ser du » bare grep «?
  • @akira Vel, jeg har allerede sagt hva jeg synes han mente sannsynligvis; han vil ikke ‘ t vil eksportere til tekst før han behandler den. Jeg tviler veldig på at han har et problem med hvilken som helst kommando som co vender seg til tekst på noen måte; der ‘ er ingen grunn til ikke å
  • @sherrellbc Det andre argumentet til pdftotext er filnavnet det skal skrive til . Imidlertid, etter konvensjon, lar verktøy deg vanligvis skrive til stdout i stedet for til en fil ved å spesifisere en - i stedet. På samme måte vil noen verktøy skrive til stdout som standard hvis du utelater et slikt argument helt (men dette er ikke alltid mulig uten å skape tvetydighet).

Svar

pdfgrep ble skrevet for akkurat dette formålet og er tilgjengelig i Ubuntu.

Den prøver å være stort sett kompatibel med grep og gir dermed «greps power», bare spesialisert for PDF-filer. Dette inkluderer vanlige grep-alternativer, for eksempel --recursive, --ignore-case eller --color.

I motsetning til pdftotext | grep, kan pdfgrep sende sidetallet til et treff på en performant måte og er generelt raskere når det ikke trenger å søke i hele dokumentet (f.eks. --max-count eller --quiet).

Den grunnleggende bruken er:

pdfgrep PATTERN FILE.. 

der PATTERN er din søkestreng og FILE en liste over filnavn (eller jokertegn i et skall).

Se manpage for mer informasjon.

Svar

Nei.

En pdf består av biter av data, noen av dem tekst, noen av dem bilder og noen av dem virkelig magiske fancy XYZ (f.eks. u3d-filer). biter komprimeres for det meste (f.eks. flat, sjekk http://www.verypdf.com/pdfinfoeditor/compression.htm ). For å «grep» en . pdf du har for å reversere komprimeringen eller trekke ut teksten.

Du kan gjøre det enten per fil med verktøy som pdf2text og grep resultatet, eller du kjører en «indekser» (se på xapian.org eller lucene ) som bygger en søkbar indeks ut av PDF-filene dine, og deretter kan du bruke søkemotorverktøy for den indeksøren for å få innholdet i pdf.

Men nei, du kan ikke grep pdf-filer og håpe på pålitelige svar uten å trekke ut teksten først.

Kommentarer

  • Tatt i betraktning pdfgrep eksisterer (se ovenfor), en flat » nei » er feil.
  • @JonathanCross, med tanke på spørsmålet sier » bruker kraften til grep, uten å konvertere til tekst først «, en flat » nei » er riktig.

Svar

Recoll kan søke i PDF-filer. Det støtter ikke vanlige uttrykk, men det har mange andre søkealternativer, så det kan passe dine behov.

Svar

Det er et duplikatspørsmål på StackOverflow. Folket der foreslår en variasjon av harish.venkarts svar:

find /path -name "*.pdf" -exec sh -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"" \; 

Fordelen i forhold til lignende svar her er --with-filename flag for grep. Dette er også noe bedre enn pdfgrep, fordi standard grep har flere funksjoner.

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files

Kommentarer

  • Jeg tror det hadde vært bedre å forlate dette som en kommentar (eller rediger) i det lignende svaret du henviser til.

Svar

Ta en titt ved det vanlige ressursgrepverktøyet crgrep som støtter søk i PDF-filer.

Det lar deg også søke i andre ressurser som innhold som er nestet i arkiver, database bord , bildedata, POM-filavhengighet og nettressurser – og kombinasjoner av disse inkludert rekursivt søk.

Svar

Du kan rør den gjennom strings først: –

cat file.pdf | strings | grep <...etc...> 

Kommentarer

  • Bare bruk strings file.pdf | grep <...>, du trenger ikke ‘ t trenger cat
  • Ja – tankene mine ser ut til å fungere bedre med strømmer … 🙂
  • vil ikke fungere hvis teksten er komprimert, som det er de fleste ganger.
  • Selv om teksten er komprimert, den ‘ er generelt små setninger (ikke engang nødvendigvis hele ord!) fint blandet med formateringsinformasjon. Ikke veldig vennlig for strings eller grep.
  • Kan du tenke deg en annen grunn til at bruk av strenger til dette ikke ville ‘ t fungerer? Jeg fant ut at bruk av strenger fungerer på noen PDF-filer, men ikke andre.

Svar

prøv dette

find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done 

for utskrift av linjene mønsteret forekommer inne i pdf

Svar

Her er et raskt skript for søk pdf i gjeldende katalog:

#!/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" \; 

Kommentarer

  • Jeg kan ikke redigere dette på grunn av å være for lite: $1 i finn-anropet bør siteres, ellers vil dette ikke ‘ t jobbe med søk vilkår med mellomrom.
  • @ankon fikset det 🙂

Svar

cd til mappen som inneholder pdf-filen din og deretter ..

pdfgrep "pattern" your.pdf 

eller hvis du vil søke i mer enn bare en pdf-fil (f.eks. i hele pdf- filer i mappen din)

pdfgrep "pattern" `ls *.pdf` 

eller

pdfgrep "pattern" $(ls *.pdf) 

Kommentarer

  • hvorfor på jorden bruker du ls til å sette filnavn i parametere? Det ‘ er ikke bare tregere, men også en dårlig ide å bruker ls som inngangen til andre kommandoer . Bare pdfgrep 'pattern' *.pdf er nok
  • @phuclv Du tar feil. pdfgrep 'pattern' *.pdf fungerer ikke.
  • @ f0nzie du ‘ tar feil. $(ls *.pdf) vil være nesten nøyaktig det samme som *.pdf, bare verre fordi spesiell filer er ikke beskyttet i anførselstegn

Svar

Jeg antar at du mener tp ikke konverterer det på disken, du kan konvertere dem til stdout og deretter grep det med pdftotext. Å takle pdf uten noen form for konvertering er ikke en praktisk tilnærming siden PDF for det meste er et binært format.

I katalogen:

ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

eller i katalogen og underkatalogene:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

Også fordi noen pdf er skanninger, må de først OCRes. Jeg skrev en ganske enkel måte å søke i alle pdfs som ikke kan være grep ed og OCR dem.

Jeg la merke til om en pdf -filen har ingen skrift, det er vanligvis ikke søkbar. Så når vi vet dette, kan vi bruke pdffonts.

De første to linjene i pdffonts er tabelloverskriften, så når en fil er søkbar har mer enn to linjers utdata, vel vitende om dette kan vi opprette:

gedit check_pdf_searchable.sh 

lim deretter inn dette

#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi 

og gjør det kjørbart

chmod +x check_pdf_searchable.sh 

og list opp alle ikke-søkbare pdfs i katalogen:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

eller i katalogen og dens underkataloger:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

Svar

Hvis du bare vil søke etter pdf-navn / egenskaper … eller enkle strenger som ikke er komprimert eller kodet, i stedet for strings du kan bruke nedenstående

grep -a STRING file.pdf cat -v file.pdf | grep STRING 

Fra 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 

og cat --help:

 -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB 

Svar

gpdf kan være det du trenger hvis du bruker Gnome ! Sjekk dette i tilfelle du ikke bruker Gnome. Den har en liste over CLI pdf-seere. Deretter kan du bruke grep for å finne et mønster.

Svar

 pdfgrep -r --include "*.pdf" -i "pattern"  

Kommentarer

  • Velkommen til siden, og takk deg for ditt bidrag. Kan du legge til noen forklaringer på hva disse alternativene betyr? Dette kan også bidra til å forklare hvordan tilnærmingen din skiller seg fra andre svar på dette spørsmålet som også anbefaler pdfgrep.

Svar

Raskeste måte er

grep -rinw "pattern" --include \*.pdf * 

Kommentarer

  • Velkommen til siden. Har du noe imot å legge til mer forklaring på den foreslåtte løsningen for å gjøre den mer tilgjengelig for ikke-eksperten? For eksempel, grep kommandolinjesøk rekursivt i underkataloger som noen som ikke er kjent med grep, kanskje ikke er klar over. Du inkluderte også -i -flagget, selv om det ikke alltid er hva brukeren vil ignorere saken. I tillegg, vennligst forklar på hvilken måte tilnærmingen din skiller seg fra svaret på f.eks. @phuclv og andre.
  • Som AdminBee sier, spør ikke spørsmålet om et sak-ufølsomt søk eller et rekursivt katalogsøk. Alternativene -n og -w er heller ikke berettiget av spørsmålet. Men enda viktigere, dette svaret forteller hvordan du søker gjennom tekstfiler hvis navn ender med .pdf – du har savnet poenget med spørsmålet.

Svar

less mypdf.pdf | grep "Hello, World" 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *