Onko olemassa hakutapoja PDF-tiedostoista grepin voimalla muuntamatta ensin tekstiksi Ubuntussa?

Kommentit

Vastaa

Asenna paketti pdfgrep ja käytä sitten komentoa:

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

—— ————

Yksinkertaisin tapa tehdä se:

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

kommentit

  • Tämä toimii myös Mac OSX: ssä (Mavericks). Asenna se haudutuksella. Yksinkertainen. Kiitos.
  • Uteliaisuuden vuoksi tarkistin pdfgrep-lähteen ja se käyttää poppleria poimimaan merkkijonot pdf: stä. Lähes täsmälleen samalla tavalla kuin @wag ’ vastaa vain sivukohtaisesti eikä oletettavasti koko asiakirjaa.
  • pdfgrep on rekursiivinen lippu. Joten tämä vastaus voidaan kenties supistaa: pdfgrep -R pattern /path/. Vaikka se voi olla vähemmän tehokasta, jos se käy läpi kaikki tiedostot, vaikka se ei ole ’ t PDF-tiedosto. Huomaan, että sillä on ongelmia kansainvälisten merkkien kanssa, kuten å, ä ja ö .
  • Itse asiassa -n -vaihtoehto on ammattilainen pdfgrepille, koska se sallii sivunumeron sisällyttämisen tulosteeseen (voi olla hyödyllistä jatkokäsittelyssä).
  • Tätä vastausta olisi helpompi käyttää, jos siinä selitettäisiin, mitkä komennon bitit on tarkoitettu kirjaimellisesti kopioitaviksi ja mitkä ovat paikkamerkkejä. Mitä ’ s pattern? Mitä ’ s {}? Mitä ’ tekee ” + kanssa? Minulla ei ole aavistustakaan ensimmäisessä käsittelyssä … joten luulen siltä sivulta, jolla käyn.

Vastaa

Jos sinulla on poppler-utils asennettuna (oletus Ubuntu Desktopilla), voit ”muuntaa” sen lennossa ja liittää sen muotoon grep :

pdftotext my.pdf - | grep "pattern" 

Tämä ei luo .txt-tiedostoa.

Kommentit

  • niin .. purat tekstin ennen sen greppaamista, mikä tarkoittaa, että vastaus on ” ei ”.
  • @akira OP tarkoitti todennäköisesti ” avaamatta PDF-tiedostoa katseluohjelmassa ja viemättä sitä tekstiin ”
  • @akira Missä näet ” grep only ”?
  • @akira No, sanoin jo mitä luulen hän todennäköisesti tarkoitti; hän ei halua ’ halua viedä tekstiksi ennen sen käsittelyä. Epäilen kovasti, että hänellä on ongelmia minkä tahansa komennon kanssa muuntaa tekstin millään tavalla; siellä ’ ei ole syytä olla
  • @sherrellbc pdftotext -kohdan toinen argumentti on tiedostonimi, johon sen pitäisi kirjoittaa . Yleensä työkalujen avulla voit yleensä kirjoittaa tiedostoon stdout tiedostoon määrittämällä sen sijaan -. Vastaavasti jotkut työkalut kirjoittavat oletusarvoisesti osoitteeseen stdout, jos jätät tällaisen argumentin kokonaan pois (mutta tämä ei ole aina mahdollista luomatta epäselvyyttä).

Vastaus

pdfgrep on kirjoitettu juuri tähän tarkoitukseen ja on saatavana Ubuntussa.

Se yrittää olla enimmäkseen yhteensopiva grep kanssa ja tarjoaa siten ”grepin voiman”, joka on erikoistunut vain PDF-tiedostoihin. Tämä sisältää yleisiä grep-asetuksia, kuten --recursive, --ignore-case tai --color.

Päinvastoin kuin pdftotext | grep, pdfgrep voi tuottaa ottelun sivunumeron suorituskykyisellä tavalla ja on yleensä nopeampi, kun sen ei tarvitse etsiä koko asiakirjaa (esim. --max-count tai --quiet).

Peruskäyttö on:

pdfgrep PATTERN FILE.. 

missä PATTERN on hakumerkkijonosi ja FILE luettelo tiedostonimistä (tai jokerimerkkeistä kuoressa).

Katso lisätietoja -sivulta .

Vastaa

Ei.

pdf-tiedosto koostuu paloista dataa, osa tekstistä, osa kuvia ja osa todella maagisia hienoja XYZ-tiedostoja (esim. .u3d-tiedostot). palat pakataan useimmiten (esim. tasainen, tarkista http://www.verypdf.com/pdfinfoeditor/compression.htm ). . pdf, jolla sinulla on käänteinen pakkaus eli pura teksti.

Voit tehdä sen joko tiedostoa kohden työkaluilla, kuten pdf2text ja grep tulosta, tai suoritat indeksoijan (katso xapian.org tai lucene ), joka rakentaa haettavan hakemiston .pdf-tiedostoistasi ja voit sitten käyttää indeksoijan hakukoneiden työkalut pdf-sisällön saamiseksi.

Mutta ei, et voi grep pdf-tiedostoja ja toivoa luotettavia vastauksia purkamatta tekstiä ensin.

Kommentit

  • Ottaen huomioon pdfgrep on olemassa (katso yllä), tasainen ” no ” on virheellinen.
  • @JonathanCross, kun otetaan huomioon kysymys: ” käyttämällä grepin voimaa muuntamatta ensin tekstiksi ”, tasainen ” ei ” on oikea.

Vastaa

Recoll voi hakea PDF-tiedostoja. Se ei tue säännöllisiä lausekkeita, mutta sillä on paljon muita hakuvaihtoehtoja, joten se saattaa sopia tarpeisiisi.

Vastaa

StackOverflowssa on kaksoiskysymys. Siellä olevat ihmiset ehdottavat muunnelmaa harish.venkarts-vastauksesta:

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

Etu tässä esitettyyn vastaavaan vastaukseen on --with-filename lippu grep: lle. Tämä on myös hieman parempi kuin pdfgrep, koska tavallisessa grepissä on enemmän ominaisuuksia.

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

Kommentit

  • Mielestäni olisi ollut parempi jättää tämä kommenttina (tai muokkauksena) vastaavassa vastauksessa, johon viitat.

Vastaa

Katso yhteisen resurssin grep-työkalussa crgrep , joka tukee hakua PDF-tiedostoista.

Sen avulla voidaan myös etsiä muita resursseja, kuten arkistoihin sisäkkäin olevaa sisältöä, tietokantaa taulukoita , kuvan metatiedot, POM-tiedostojen riippuvuudet ja verkkoresurssit – ja näiden yhdistelmät, mukaan lukien rekursiivinen haku.

Vastaa

Voisit vie se ensin läpi strings: –

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

kommentit

  • Käytä vain strings file.pdf | grep <...>, et ’ tarvitse cat
  • Joo – mieleni näyttää toimivan paremmin virtojen kanssa … 🙂
  • se ei toimi, jos teksti on pakattu, mikä on useimmiten.
  • Vaikka tekstiä ei ole pakattu, se ’ sekoittaa yleensä pieniä lauseita (ei edes välttämättä kokonaisia sanoja!) hienosti sekoitettuna muotoilutietoihin. Ei kovin ystävällinen käyttäjille strings tai grep.
  • Voitteko miettiä jotain muuta syytä miksi merkkijonojen käyttäminen tälle ’ toimiiko? Huomasin, että merkkijonojen käyttö toimii joillakin PDF-tiedostoilla, mutta ei muilla.

Vastaa

kokeile tätä

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

niiden viivojen tulostamiseen, jotka kuvio esiintyy pdf: n sisällä

Vastaa

Tässä on pikakoodaus hakuun pdf-tiedostona nykyisessä hakemistossa:

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

Kommentit

  • En voi muokata tätä, koska olen vähäinen: Löydön kutsussa oleva $1 tulisi lainata, muuten tämä ei toimi ’ ei toimi haun kanssa termit välilyönneillä.
  • @ankon korjasi sen 🙂

Vastaa

cd kansio, joka sisältää pdf-tiedostosi ja sitten ..

pdfgrep "pattern" your.pdf 

tai jos haluat etsiä useammasta kuin yhdestä pdf-tiedostosta (esim. kansiossa olevat tiedostot)

pdfgrep "pattern" `ls *.pdf` 

tai

pdfgrep "pattern" $(ls *.pdf) 

Kommentit

  • miksi maan päällä, asetatko tiedostonimien parametreihin ls? ’ on paitsi hitaampi myös huono idea käyttää ls -lähtöä syöte muihin komentoihin . Vain pdfgrep 'pattern' *.pdf riittää
  • @phuclv Olet väärässä. pdfgrep 'pattern' *.pdf ei toimi.
  • @ f0nzie olet ’ väärässä. $(ls *.pdf) on melkein täsmälleen sama kuin *.pdf, vain pahempaa, koska erityinen tiedostoja ei ole suojattu lainausmerkeillä

Vastaa

Oletan, että tarkoitat, että tp ei muunna sitä levyllä, voi muuntaa ne muotoon stdout ja sitten napata sen kohdalla pdftotext. PDF: n hakeminen ilman minkäänlaista muunnosta ei ole käytännöllinen lähestymistapa, koska PDF on enimmäkseen binaarimuoto.

Hakemistossa:

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

tai hakemistossa ja sen alihakemistoissa:

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

Myös siksi, että jotkut pdf ovat skannauksia, ne täytyy ensin tarkistaa OCR: llä. Kirjoitin melko yksinkertaisen tavan etsiä kaikkia pdf-tiedostoja, joita ei voida grep muokata, ja OCR: itä.

Huomasin, että pdf -tiedostossa ei ole mitään kirjasinta, jota ei yleensä voi hakea. Joten tietäen tämän voimme käyttää pdffonts.

pdffonts ovat taulukon otsikko, joten kun tiedosto on haettavissa, sillä on enemmän kuin kaksi rivilähtöä, tämän tietäen voimme luoda:

gedit check_pdf_searchable.sh 

liitä tämä sitten

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

tee siitä sitten suoritettava

chmod +x check_pdf_searchable.sh 

ja sitten luetella kaikki hakemattomat pdf-tiedostot hakemistossa:

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

tai hakemistossa ja sen alihakemistoissa:

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

Vastaa

Jos haluat vain etsiä pdf-nimiä / ominaisuuksia … tai yksinkertaisia merkkijonoja, joita ei ole pakattu tai koodattu, sen sijaan strings voit käyttää seuraavaa

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

Alkaen 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 

ja cat --help:

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

vastaus

gpdf voi olla mitä tarvitset, jos käytät Gnomea ! Tarkista tämä , jos et käytä Gnomea. Sillä on luettelo CLI: n pdf-katsojista. Sitten voit käyttää grep -kuvaketta jonkin mallin löytämiseen.

Vastaa

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

Kommentit

  • Tervetuloa sivustolle ja kiitos sinulle panoksestasi. Voisitteko lisätä selityksen siitä, mitä nämä vaihtoehdot tarkoittavat? Tämä voi myös auttaa selittämään, miten lähestymistapasi eroaa muista vastauksista tähän kysymykseen, jotka myös suosittelevat pdfgrep.

Vastaus

Nopein tapa on

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

kommentit

  • Tervetuloa sivustolle. Haluatko lisätä selityksiä ehdotettuun ratkaisuun, jotta se olisi helpommin muiden kuin asiantuntijoiden saatavilla? Esimerkiksi grep -komentorivisi hakee rekursiivisesti alihakemistoista, joista joku, joka ei tunne grep, ei ehkä tiedä. Lisäsit myös -i -lipun, vaikka tapauksen huomiotta jättäminen ei aina ole käyttäjän haluama. Selitä lisäksi, millä tavoin lähestymistapasi eroaa esim. Kyselystä @phuclv ja muut.
  • Kuten AdminBee sanoo, kysymys ei edellytä kirjainkoon erottelua tai rekursiivista hakemistoa. Myöskään vaihtoehdot -n ja -w eivät ole perusteltuja kysymyksellä. Vielä tärkeämpää on, että tämä vastaus kertoo, kuinka voit etsiä tekstitiedostoja, joiden nimet päättyvät .pdf – olet unohtanut kysymyksen asian.

vastaus

less mypdf.pdf | grep "Hello, World" 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *