Er det en måte å søke i PDF-filer ved å bruke kraften til grep, uten å konvertere til tekst først i Ubuntu?
Kommentarer
- Se også Er det en slags PDF til tekstkonverterer? og Kommandolinjeverktøy for å søke på setninger i stort antall pdf-filer .
- For folk som kommer hit via søk: Hvis du først er villig til å konvertere den til tekstfiler, har du se på Hvordan søke i innholdet i flere pdf-filer?
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 tilstdout
i stedet for til en fil ved å spesifisere en-
i stedet. På samme måte vil noen verktøy skrive tilstdout
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 trengercat
- 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
ellergrep
. - 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 . Barepdfgrep '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 medgrep
, 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"