Er der en måde at søge i PDF-filer ved hjælp af kraften i grep uden først at konvertere til tekst i Ubuntu?
Kommentarer
- Se også Er der en slags PDF til tekst-konverter? og Kommandolinjeværktøj til søgning af sætninger i stort antal pdf-filer .
- For folk, der kommer her via søgning: Hvis du først er villig til at konvertere den til tekstfiler, skal du have en se på Sådan søges i indhold i flere pdf-filer?
Svar
Installer pakken pdfgrep
, og brug derefter kommandoen:
find /path -iname "*.pdf" -exec pdfgrep pattern {} +
—— ————
Enkleste måde at gøre det på:
pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf
Kommentarer
- Dette fungerer også i mac osx (Mavericks). Installer det ved hjælp af brygge. Enkel. Tak.
- Af nysgerrighed kontrollerede jeg kilden til pdfgrep, og den bruger poppler til at udtrække strenge fra pdf. Næsten nøjagtigt som @wag ‘ s svar kun sidevis i stedet for formodentlig hele dokumentet.
-
pdfgrep
har et rekursivt flag. Så dette svar kunne måske reduceres til:pdfgrep -R pattern /path/
. Selvom det måske er mindre effektivt, hvis det går gennem hver fil, selvom det ikke er ‘ t en PDF. Og jeg bemærker, at det har problemer med internationale tegn som å, ä og ö . - Faktisk er indstillingen
-n
et proffs til pdfgrep, da det gør det muligt at medtage sidenummeret i output (kan være nyttigt til videre behandling). - Dette svar ville være lettere at bruge, hvis det forklarede, hvilke kommandobit der er beregnet til at kopieres bogstaveligt, og hvilke der er pladsholdere. Hvad ‘ s
pattern
? Hvad ‘ s{}
? Hvad ‘ er der med `+`? Jeg har ingen anelse om ved første læsning … så jeg går ud til manpage.
Svar
Hvis du har poppler-utils
installeret (standard på Ubuntu Desktop), kan du “konvertere” det i farten og pibe det til grep
:
pdftotext my.pdf - | grep "pattern"
Dette opretter ikke en .txt-fil.
Kommentarer
- så .. du ekstraherer teksten, før du griber den, hvilket betyder, at svaret er ” nej “.
- @akira OP betød sandsynligvis ” uden at åbne PDFen i en fremviser og eksportere til tekst ”
- @akira Hvor ser du ” kun grep “?
- @akira Nå, jeg har allerede sagt hvad jeg synes han mente sandsynligvis; han vil ikke ‘ ikke ønsker at eksportere til tekst før han behandler den. Jeg tvivler meget på, at han har et problem med enhver kommando, der co vender sig til tekst på nogen måde; der ‘ er ingen grund til ikke at
- @sherrellbc Det andet argument for
pdftotext
er det filnavn, det skal skrive til . Men efter konvention giver værktøjer dig typisk mulighed for at skrive tilstdout
i stedet for til en fil ved at angive en-
i stedet. Tilsvarende vil nogle værktøjer skrive tilstdout
som standard, hvis du udelader et sådant argument helt (men det er ikke altid muligt uden at skabe tvetydighed).
Svar
pdfgrep blev skrevet til netop dette formål og er tilgængelig i Ubuntu.
Det forsøger at være for det meste kompatibelt med grep
og giver således “greps power”, kun specialiseret til PDF-filer. Dette inkluderer almindelige grep-indstillinger, såsom --recursive
, --ignore-case
eller --color
.
I modsætning til pdftotext | grep
kan pdfgrep sende sidetallet for et match på en performant måde og er generelt hurtigere, når det ikke behøver at søge i hele dokumentet (f.eks. --max-count
eller --quiet
).
Grundlæggende brug er:
pdfgrep PATTERN FILE..
hvor PATTERN
er din søgestreng og FILE
en liste med filnavne (eller jokertegn i en shell).
Se manpage for flere oplysninger.
Svar
Nej.
En pdf består af klumper af data, nogle af dem tekst, nogle af dem billeder og nogle af dem virkelig magiske fancy XYZ (f.eks. u3d-filer). klumper komprimeres oftest (f.eks. fladt, tjek http://www.verypdf.com/pdfinfoeditor/compression.htm ). For at “grep” en . pdf du har til at vende komprimeringen eller udtrække teksten.
Du kan enten gøre det pr. fil med værktøjer som pdf2text
og grep resultatet, eller du kører en “indexer” (se på xapian.org eller lucene ), som bygger et søgbart indeks ud af dine .pdf-filer, og så kan du bruge indekseringsværktøjets søgemaskineværktøjer for at få indholdet af pdfen.
Men nej, du kan ikke grep
pdf-filer og håbe på pålidelige svar uden at udtrække teksten først.
Kommentarer
- I betragtning af at
pdfgrep
findes (se ovenfor), er en flad ” nej ” er forkert. - @JonathanCross, i betragtning af spørgsmålet siger ” ved hjælp af kraften i grep uden først at konvertere til tekst “, en flad ” ingen ” er korrekt.
Svar
Recoll kan søge i PDF-filer. Det understøtter ikke regulære udtryk, men det har mange andre søgemuligheder, så det passer muligvis til dine behov.
Svar
Der er et duplikatspørgsmål på StackOverflow. Folkene der foreslår en variation af harish.venkarts svar:
find /path -name "*.pdf" -exec sh -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"" \;
Fordelen i forhold til det lignende svar her er --with-filename
flag for grep. Dette er også noget bedre end pdfgrep, fordi standard grep har flere funktioner.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Kommentarer
- Jeg tror, det ville have været bedre at forlade dette som en kommentar (eller rediger) i det lignende svar, du henviser til.
Svar
Se ved det fælles ressource grep-værktøj crgrep , som understøtter søgning i PDF-filer.
Det tillader også søgning i andre ressourcer som indhold, der er indlejret i arkiver, database tabeller , billeddata, POM-filafhængighed og webressourcer – og kombinationer af disse inklusive rekursiv søgning.
Svar
Du kunne rør det gennem strings
først: –
cat file.pdf | strings | grep <...etc...>
Kommentarer
- Brug bare
strings file.pdf | grep <...>
, du behøver ikke ‘ t har brug forcat
- Ja – mit sind ser ud til at fungere bedre med streams … 🙂
- fungerer ikke, hvis teksten er komprimeret, hvilket det ofte er.
- Selvom teksten er ukomprimeret, den ‘ er generelt små stykker sætninger (ikke engang nødvendigvis hele ord!) fint blandet med formateringsoplysninger. Ikke meget venligt for
strings
ellergrep
. - Kan du tænke på en anden grund til, at du bruger strenge til dette ikke ville ‘ t arbejde? Jeg fandt ud af, at brug af strenge fungerer på nogle 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
til udskrivning af linjerne, mønsteret forekommer inde i pdf
Svar
Her er et hurtigt script til søgning i pdf i den aktuelle mappe:
#!/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å grund af at være for lille:
$1
i find-invokationen skal citeres, ellers vil dette ikke ‘ t arbejde med søgning vilkår med mellemrum. - @ankon fikset det 🙂
Svar
cd til din mappe, der indeholder din pdf-fil og derefter ..
pdfgrep "pattern" your.pdf
eller hvis du vil søge i mere end blot en pdf-fil (f.eks. i alle pdf- filer i din mappe)
pdfgrep "pattern" `ls *.pdf`
eller
pdfgrep "pattern" $(ls *.pdf)
Kommentarer
- hvorfor på jorden bruger du ls til at sætte filnavne i parametre? Det ‘ er ikke kun langsommere, men også en dårlig idé at bruger
ls
output som input til andre kommandoer . Barepdfgrep 'pattern' *.pdf
er nok - @phuclv Du tager fejl.
pdfgrep 'pattern' *.pdf
fungerer ikke. - @ f0nzie du ‘ tager fejl.
$(ls *.pdf)
vil være næsten nøjagtigt det samme som*.pdf
, kun værre fordi speciel filer er ikke beskyttet i anførselstegn
Svar
Jeg antager, at du mener tp ikke konverterer det på disken, du kan konvertere dem til stdout
og derefter grep det med pdftotext
. Grepping af pdf uden nogen form for konvertering er ikke en praktisk tilgang, da PDF
for det meste er et binært format.
I kataloget:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
eller i kataloget og dets underkataloger:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Også fordi nogle pdf
er scanninger, skal de først OCRes. Jeg skrev en ret enkel måde at søge i alle pdfs, der ikke kan være grep
ed og OCR dem.
Jeg bemærkede, om en pdf
-filen har ingen skrifttype, den kan normalt ikke søges. Så vel vidende dette kan vi bruge pdffonts
.
De første 2 linjer i pdffonts
er tabelhovedet, så når en fil kan søges, har mere end to linjers output, velvidende om dette kan vi oprette:
gedit check_pdf_searchable.sh
Indsæt derefter denne
#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi
og gør den derefter eksekverbar
chmod +x check_pdf_searchable.sh
, og læs derefter alle ikke-søgbare pdfs i biblioteket:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
eller i kataloget og dets underkataloger:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Svar
Hvis du bare vil søge efter pdf-navne / egenskaber … eller enkle strenge, der ikke er komprimeret eller kodet, i stedet for strings
du kan bruge 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 har brug for, hvis du bruger Gnome ! Kontroller dette , hvis du ikke bruger Gnome. Den har en liste over CLI-pdf-seere. Derefter kan du bruge grep
til at finde noget mønster.
Svar
pdfgrep -r --include "*.pdf" -i "pattern"
Kommentarer
- Velkommen til siden, og tak dig for dit bidrag. Kan du tilføje nogle forklaringer på, hvad disse muligheder betyder? Dette kan også hjælpe med at forklare, hvordan din tilgang adskiller sig fra andre svar på dette spørgsmål, der også anbefaler
pdfgrep
.
Svar
Den hurtigste måde er
grep -rinw "pattern" --include \*.pdf *
Kommentarer
- Velkommen til siden. Har du noget imod at tilføje flere forklaringer til din foreslåede løsning for at gøre den mere tilgængelig for ikke-eksperten? For eksempel søger din
grep
kommandolinjekurs rekursivt i underkataloger, som en person, der ikke er bekendt medgrep
, muligvis ikke er opmærksom på. Du inkluderede også-i
flag, selvom ignorering af sagen måske ikke altid er, hvad brugeren ønsker. Derudover skal du forklare på hvilken måde din tilgang adskiller sig fra svaret på f.eks. @phuclv og andre. - Som AdminBee siger, spørger spørgsmålet ikke om en sagfølsom søgning eller en rekursiv mappesøgning. Valgmulighederne
-n
og-w
er heller ikke berettiget af spørgsmålet. Men vigtigere er det, at dette svar fortæller, hvordan man søger gennem tekstfiler, hvis navne slutter med.pdf
– du har gået glip af spørgsmålet.
Svar
less mypdf.pdf | grep "Hello, World"