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

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 til stdout i stedet for til en fil ved at angive en - i stedet. Tilsvarende vil nogle værktøjer skrive til stdout 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 for cat
  • 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 eller grep.
  • 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 . Bare pdfgrep '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 med grep, 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" 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *