Onko olemassa hakutapoja PDF-tiedostoista grepin voimalla muuntamatta ensin tekstiksi Ubuntussa?
Kommentit
- Katso myös Onko jonkinlainen PDF-muunnin? ja Komentorivityökalu hakemaan lauseita suuresta määrästä pdf-tiedostoja .
- Ihmisille, jotka tulevat tänne haun kautta: Jos olet valmis muuntamaan sen ensin tekstitiedostoiksi, pyydä katso Kuinka etsiä useiden pdf-tiedostojen sisältöä?
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 tiedostoonstdout
tiedostoon määrittämällä sen sijaan-
. Vastaavasti jotkut työkalut kirjoittavat oletusarvoisesti osoitteeseenstdout
, 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 ’ tarvitsecat
- 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
taigrep
. - 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 . Vainpdfgrep '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 tunnegrep
, 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"