Finns det ett sätt att söka i PDF-filer med kraften i grep, utan att konvertera till text först i Ubuntu?

Kommentarer

Svar

Installera paketet pdfgrep, använd sedan kommandot:

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

—— ————

Enklast sätt att göra det:

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

Kommentarer

  • Detta fungerar också i mac osx (Mavericks). Installera den med brygga. Enkel. Tack.
  • Av nyfikenhet kollade jag källan till pdfgrep och den använder poppler för att extrahera strängar från pdf. Nästan exakt som @wag ’ s svarar endast sidvis snarare än förmodligen hela dokumentet.
  • pdfgrep har en rekursiv flagga. Så detta svar kan kanske reduceras till: pdfgrep -R pattern /path/. Även om det kan vara mindre effektivt om det går igenom alla filer även om det inte är ’ t en PDF. Och jag märker att det har problem med internationella tecken som å, ä och ö .
  • Egentligen är alternativet -n ett proffs för pdfgrep eftersom det gör det möjligt att inkludera sidnumret i utdata (kan vara till hjälp för vidare bearbetning).
  • Detta svar skulle vara lättare att använda om det förklarades vilka bitar av kommandot som är avsedda att kopieras bokstavligen och vilka som är platshållare. Vad ’ s pattern? Vad ’ s {}? Vad ’ händer med `+`? Jag har ingen aning vid första behandlingen … så jag går antagligen till arbetssidan.

Svar

Om du har poppler-utils installerat (standard på Ubuntu Desktop) kan du ”konvertera” det direkt och leda det till grep :

pdftotext my.pdf - | grep "pattern" 

Detta skapar inte en .txt-fil.

Kommentarer

  • så .. du extraherar texten innan du tar tag i den vilket betyder att svaret är ” nej ”.
  • @akira OP menade antagligen ” utan att öppna PDF-filen i en tittare och exportera till text ”
  • @akira Var ser du ” endast grep ”?
  • @akira Tja, jag har redan sagt vad jag tycker han menade förmodligen; han vill inte ’ t exportera till text innan han bearbetar den. Jag tvivlar mycket på att han har problem med något kommando som co ändras till text på något sätt; där ’ är ingen anledning att inte
  • @sherrellbc Det andra argumentet för pdftotext är filnamnet det ska skriva till . Men enligt konvention tillåter verktygen dig vanligtvis att skriva till stdout istället för till en fil genom att ange en - istället. På samma sätt skulle vissa verktyg skriva till stdout som standard om du utelämnar ett sådant argument helt (men det är inte alltid möjligt utan att skapa tvetydighet).

Svar

pdfgrep skrevs för exakt detta ändamål och finns i Ubuntu.

Den försöker vara mestadels kompatibel med grep och ger därmed ”grep-kraften”, endast specialiserad för PDF-filer. Detta inkluderar vanliga grep-alternativ, som --recursive, --ignore-case eller --color.

Till skillnad från pdftotext | grep kan pdfgrep mata ut sidnumret för en matchning på ett utförande sätt och är i allmänhet snabbare när det inte behöver söka i hela dokumentet (t.ex. --max-count eller --quiet).

Den grundläggande användningen är:

pdfgrep PATTERN FILE.. 

där PATTERN är din söksträng och FILE en lista med filnamn (eller jokertecken i ett skal).

Se manpage för mer information.

Svar

Nej.

En pdf består av bitar av data, en del av dem text, några av dem bilder och några av dem riktigt magiska snygga XYZ (t.ex. .u3d-filer). bitar komprimeras oftast (t.ex. platt, kontrollera http://www.verypdf.com/pdfinfoeditor/compression.htm ). För att ”grep” en . pdf du har för att vända komprimeringen eller extrahera texten.

Du kan göra det antingen per fil med verktyg som pdf2text och grep resultatet, eller så kör du en ”indexer” (titta på xapian.org eller lucene ) som bygger ett sökbart index av dina .pdf-filer och sedan kan du använda sökmotorverktyg för indexeraren för att få innehållet i pdf.

Men nej, du kan inte grep pdf-filer och hoppas på tillförlitliga svar utan att extrahera texten först.

Kommentarer

  • Med tanke på att pdfgrep finns (se ovan), en platt ” nej ” är felaktigt.
  • @JonathanCross, med tanke på frågan står ” använder grep-kraften utan att först konvertera till text ”, en platt ” nej ” är korrekt.

Svar

Recoll kan söka i PDF-filer. Det stöder inte vanliga uttryck, men det har många andra sökalternativ, så det kanske passar dina behov.

Svar

Det finns en dubblettfråga på StackOverflow. Människorna där föreslår en variation av harish.venkarts svar:

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

Fördelen jämfört med liknande svar här är --with-filename flagga för grep. Detta är också något överlägset pdfgrep, eftersom standard grep har fler funktioner.

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

Kommentarer

  • Jag tror att det hade varit bättre att lämna detta som en kommentar (eller redigera) i det liknande svaret du hänvisar till.

Svar

Ta en titt vid det gemensamma resurs grep-verktyget crgrep som stöder sökning i PDF-filer.

Det gör det också möjligt att söka efter andra resurser som innehåll kapslat i arkiv, databas tabeller , bild-metadata, POM-filberoende och webbresurser – och kombinationer av dessa inklusive rekursiv sökning.

Svar

Du kan rör den igenom strings först: –

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

Kommentarer

  • Använd bara strings file.pdf | grep <...>, du behöver inte ’ t cat
  • Ja – mitt sinne verkar fungera bättre med strömmar … 🙂
  • fungerar inte om texten är komprimerad, vilket det är oftast.
  • Även om texten är okomprimerad, den ’ är i allmänhet små bitar av meningar (inte ens nödvändigtvis hela ord!) fint blandat med formateringsinformation. Inte särskilt vänligt för strings eller grep.
  • Kan du tänka dig en annan anledning till att använda strängar för detta skulle inte ’ fungerar inte? Jag upptäckte att användning av strängar fungerar på vissa PDF-filer men inte andra.

Svar

prova detta

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

för utskrift av rader mönstret förekommer i pdf-filen

Svar

Här är ett snabbt skript för att söka pdf i den aktuella katalogen:

#!/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

  • Jag kan inte redigera detta på grund av att jag är för litet: $1 i sökanropet bör citeras, annars vann detta ’ t med sökning termer med mellanslag.
  • @ankon fixade det 🙂

Svar

cd till din mapp som innehåller din pdf-fil och sedan ..

pdfgrep "pattern" your.pdf 

eller om du vill söka i mer än bara en pdf-fil (t.ex. i alla pdf- filer i din mapp)

pdfgrep "pattern" `ls *.pdf` 

eller

pdfgrep "pattern" $(ls *.pdf) 

Kommentarer

  • varför på jorden använder du ls för att sätta filnamn i parametrar? Det ’ är inte bara långsammare utan också en dålig idé att använder ls som inmatningen till andra kommandon . Bara pdfgrep 'pattern' *.pdf räcker
  • @phuclv Du har fel. pdfgrep 'pattern' *.pdf fungerar inte.
  • @ f0nzie du ’ har fel. $(ls *.pdf) kommer att vara nästan exakt samma som *.pdf, bara värre eftersom special filer skyddas inte i citat

Svar

Jag antar att du menar att tp inte konverterar det på disken, du kan konvertera dem till stdout och sedan grep den med pdftotext. Att greppa pdf utan någon form av konvertering är inte ett praktiskt tillvägagångssätt eftersom PDF är mestadels ett binärt format.

I katalogen:

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

eller i katalogen och dess underkataloger:

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

Också eftersom vissa pdf är skanningar måste de först OCRas. Jag skrev ett ganska enkelt sätt att söka i alla pdfs som inte kan grep ed och OCR dem.

Jag märkte om en pdf -filen har inget teckensnitt, det är vanligtvis inte sökbart. Så att veta detta kan vi använda pdffonts.

De första 2 raderna i pdffonts är tabellrubriken, så när en fil är sökbar har mer än två rader, med vetskap om detta kan vi skapa:

gedit check_pdf_searchable.sh 

klistra sedan in den här

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

gör den sedan körbar

chmod +x check_pdf_searchable.sh 

och lista sedan alla icke-sökbara pdfs i katalogen:

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

eller i katalogen och dess underkataloger:

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

Svar

Om du bara vill söka efter pdf-namn / egenskaper … eller enkla strängar som inte är komprimerade eller kodade då istället för strings du kan använda nedanstående

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

Från 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 

och cat --help:

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

Svar

gpdf kan vara vad du behöver om du använder Gnome ! Kontrollera detta om du inte använder Gnome. Den har en lista över CLI-pdf-tittare. Då kan du använda grep för att hitta ett mönster.

Svar

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

Kommentarer

  • Välkommen till sajten och tack dig för ditt bidrag. Kan du lägga till en förklaring om vad dessa alternativ betyder? Detta kan också hjälpa till att förklara hur din inställning skiljer sig från andra svar på denna fråga som också rekommenderar pdfgrep.

Svar

Det snabbaste sättet är

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

Kommentarer

  • Välkommen till webbplatsen. Har du något emot att lägga till mer förklaring till din föreslagna lösning för att göra den mer tillgänglig för icke-experten? Till exempel kan din grep kommandoradssökningar rekursivt i underkataloger som någon som inte känner till grep kanske inte känner till. Du inkluderade också flaggan -i även om det inte alltid är vad användaren vill ignorera ärendet. Dessutom, förklara på vilket sätt din inställning skiljer sig från svaret på t.ex. @phuclv och andra.
  • Som AdminBee säger ställer frågan inte om en skiftlägeskänslig sökning eller en rekursiv katalogsökning. Alternativen -n och -w är inte heller motiverade av frågan. Men, ännu viktigare, det här svaret berättar hur man söker igenom textfiler vars namn slutar med .pdf – du har missat frågan.

Svar

less mypdf.pdf | grep "Hello, World" 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *