Is er een manier om PDF-bestanden te doorzoeken met de kracht van grep, zonder eerst naar tekst te converteren in Ubuntu?
Opmerkingen
- Zie ook Is er een soort PDF naar tekstconverter? en Opdrachtregelprogramma om zinnen in een groot aantal pdf-bestanden te zoeken .
- Voor mensen die hier via zoeken komen: als je bereid bent om het eerst naar tekstbestanden te converteren, neem dan een kijk naar Hoe zoek ik de inhoud van meerdere pdf-bestanden?
Antwoord
Installeer het pakket pdfgrep
en gebruik vervolgens het commando:
find /path -iname "*.pdf" -exec pdfgrep pattern {} +
—— ————
Eenvoudigste manier om dat te doen:
pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf
Reacties
- Dit werkt ook in mac osx (Mavericks). Installeer het met brouwsel. Gemakkelijk. Bedankt.
- Uit nieuwsgierigheid heb ik de bron van pdfgrep gecontroleerd en het gebruikt poppler om strings uit de pdf te extraheren. Bijna precies zoals @wag ‘ s antwoord alleen paginagewijs in plaats van, vermoedelijk, het hele document.
-
pdfgrep
ook heeft een recursieve vlag. Dus dit antwoord kan misschien worden teruggebracht tot:pdfgrep -R pattern /path/
. Hoewel het misschien minder effectief is als het door elk bestand gaat, zelfs als het geen ‘ t een PDF is. En ik merk dat het problemen heeft met internationale tekens zoals å, ä en ö . - Eigenlijk is de optie
-n
een pro voor pdfgrep omdat het het mogelijk maakt om het paginanummer op te nemen in de uitvoer (kan handig zijn voor verdere verwerking). - Dit antwoord zou gemakkelijker te gebruiken zijn als het zou uitleggen welke bits van het commando letterlijk moeten worden gekopieerd en welke tijdelijke aanduidingen zijn. Welke ‘ s
pattern
? Welke ‘ s{}
? Wat is ‘ aan de hand met de `+`? Ik heb geen idee bij de eerste lezing … dus ga naar de manpagina die ik ga, denk ik.
Antwoord
Als je poppler-utils
hebt geïnstalleerd (standaard op Ubuntu Desktop), kun je het direct “converteren” en naar grep
:
pdftotext my.pdf - | grep "pattern"
Dit zal “geen .txt-bestand maken.
Reacties
- dus .. je extraheert de tekst voordat je hem grept, wat betekent dat het antwoord ” nee ” is.
- @akira Het OP betekende waarschijnlijk ” zonder de pdf te openen in een viewer en te exporteren naar tekst ”
- @akira Waar zie je ” grep alleen “?
- @akira Nou, ik heb al gezegd wat ik denk hij bedoelde waarschijnlijk; hij ‘ wil niet naar tekst exporteren voordat hij deze verwerkt. Ik betwijfel ten zeerste of hij een probleem heeft met enig commando dat co nverts naar tekst op enigerlei wijze; daar ‘ is er geen reden om het niet te doen
- @sherrellbc Het tweede argument van
pdftotext
is de bestandsnaam waarnaar het moet schrijven . Volgens afspraak kunt u met tools echter meestal naarstdout
schrijven in plaats van naar een bestand door in plaats daarvan een-
op te geven. Op dezelfde manier schrijven sommige tools standaard naarstdout
als je zon argument helemaal weglaat (maar dit is niet altijd mogelijk zonder dubbelzinnigheid te creëren).
Answer
pdfgrep is precies voor dit doel geschreven en is beschikbaar in Ubuntu.
Het probeert grotendeels compatibel te zijn met grep
en biedt dus “de kracht van grep”, alleen gespecialiseerd voor PDFs. Dat omvat veelgebruikte grep-opties, zoals --recursive
, --ignore-case
of --color
.
In tegenstelling tot pdftotext | grep
, kan pdfgrep het paginanummer van een overeenkomst op een performante manier uitvoeren en is over het algemeen sneller wanneer het niet het hele document hoeft te doorzoeken (bijv. --max-count
of --quiet
).
Het basisgebruik is:
pdfgrep PATTERN FILE..
waarbij PATTERN
uw zoekreeks is en FILE
een lijst met bestandsnamen (of jokertekens in een shell).
Zie de manpage voor meer informatie.
Antwoord
Nee.
Een pdf bestaat uit stukjes gegevens, sommige uit tekst, sommige met afbeeldingen en sommige met echt magisch mooie XYZ (bijv. .u3d-bestanden). brokken zijn meestal gecomprimeerd (bijv. plat, vink http://www.verypdf.com/pdfinfoeditor/compression.htm aan). Om een . pdf die je hebt om de compressie om te keren oftewel de tekst te extraheren.
Je kunt dat ofwel per bestand doen met tools zoals pdf2text
en grep het resultaat, of je voert een “indexer” uit (kijk naar xapian.org of lucene ) die een doorzoekbare index opbouwt uit uw .pdf-bestanden en dan kunt u de zoekmachine tools van die indexer om de inhoud van de pdf te krijgen.
Maar nee, je kunt geen grep
pdf-bestanden en hopen op betrouwbare antwoorden zonder de tekst te extraheren eerste.
Reacties
- Aangezien
pdfgrep
bestaat (zie hierboven), een platte ” nee ” is onjuist. - @JonathanCross, aangezien de vraag ” is met de kracht van grep, zonder eerst naar tekst te converteren “, een platte ” nee ” is correct.
Antwoord
Recoll kan PDFs doorzoeken. Het ondersteunt geen reguliere expressies, maar het heeft veel andere zoekopties, dus het kan aan uw behoeften voldoen.
Antwoord
Er is een dubbele vraag op StackOverflow. De mensen daar suggereren een variant van het antwoord van harish.venkarts:
find /path -name "*.pdf" -exec sh -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"" \;
Het voordeel ten opzichte van het vergelijkbare antwoord hier is het --with-filename
vlag voor grep. Dit is ook enigszins superieur aan pdfgrep, omdat de standaard grep meer mogelijkheden heeft.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Reacties
- Ik denk dat het beter was geweest om dit achter te laten als een opmerking (of bewerk) in het vergelijkbare antwoord waarnaar u verwijst.
Antwoord
Kijk eens op de algemene resource grep-tool crgrep die zoeken in PDF-bestanden ondersteunt.
Het maakt het ook mogelijk om andere bronnen te doorzoeken, zoals inhoud genest in archieven, database tafels , afbeeldingsmetagegevens, POM-bestandsafhankelijkheden en webbronnen – en combinaties hiervan inclusief recursief zoeken.
Antwoord
Je zou kunnen leid het door strings
eerst: –
cat file.pdf | strings | grep <...etc...>
Reacties
- Gebruik gewoon
strings file.pdf | grep <...>
, je hebt ‘ geencat
- Ja – mijn geest lijkt beter te werken met streams … 🙂
- werkt niet als tekst is gecomprimeerd, wat meestal het geval is.
- Zelfs als de tekst is niet gecomprimeerd, het ‘ is over het algemeen kleine stukjes zinnen (niet eens noodzakelijk hele woorden!) die fijn vermengd zijn met opmaakinformatie. Niet erg vriendelijk voor
strings
ofgrep
. - Kun je een andere reden bedenken waarom het gebruik van strings hiervoor niet ‘ werkt het niet? Ik ontdekte dat het gebruik van strings op sommige pdfs werkt, maar niet op andere.
nodig
Answer
probeer dit
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done
voor het afdrukken van de lijnen komt het patroon voor in de pdf
Antwoord
Hier is een snel script voor het zoeken naar pdf in de huidige directory:
#!/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" \;
Reacties
- Ik kan dit niet bewerken omdat ik te klein ben: de
$1
in de aanroep voor zoeken moet worden geciteerd, anders zal ‘ niet werken met zoeken termen met spaties. - @ankon heeft het opgelost 🙂
Antwoord
cd naar uw map met uw pdf-bestand en dan ..
pdfgrep "pattern" your.pdf
of als u in meer dan één pdf-bestand wilt zoeken (bijv. in alle pdf- bestanden in uw map)
pdfgrep "pattern" `ls *.pdf`
of
pdfgrep "pattern" $(ls *.pdf)
Reacties
- waarom gebruik je in vredesnaam ls om bestandsnamen in parameters te plaatsen? Het ‘ is niet alleen langzamer, maar ook een slecht idee om
ls
uitvoer te gebruiken als de invoer van andere opdrachten . Alleenpdfgrep 'pattern' *.pdf
is genoeg. - @phuclv Je hebt het mis.
pdfgrep 'pattern' *.pdf
zal niet werken. - @ f0nzie je ‘ heeft het mis.
$(ls *.pdf)
zal bijna exact hetzelfde zijn als*.pdf
, alleen slechter omdat speciaal bestanden zijn niet beschermd tussen aanhalingstekens
Answer
Ik neem aan dat je bedoelt dat je het niet naar de schijf converteert, je kan ze converteren naar stdout
en het vervolgens grepen met pdftotext
. Grepping van de pdf zonder enige vorm van conversie is geen praktische benadering aangezien PDF
meestal een binair formaat is.
In de map:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
of in de map en zijn submappen:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Ook omdat sommige pdf
scans zijn, moeten ze eerst worden herkend. Ik heb een vrij eenvoudige manier geschreven om alle pdfs te doorzoeken die niet grep
ed kunnen zijn en ze te OCRen.
Ik merkte dat een pdf
-bestand heeft geen lettertype, het is meestal niet doorzoekbaar. Dus wetende dat we pdffonts
kunnen gebruiken.
Eerste 2 regels van de pdffonts
zijn de tabelkop, dus als een bestand doorzoekbaar is, heeft het meer dan twee regels uitvoer, wetende dat we dit kunnen maken:
gedit check_pdf_searchable.sh
plak dit dan
#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi
maak het dan uitvoerbaar
chmod +x check_pdf_searchable.sh
en maak een lijst van alle niet-doorzoekbare pdfs in de directory:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
of in de directory en zijn subdirectorys:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Antwoord
Als u alleen naar pdf-namen / -eigenschappen wilt zoeken … of eenvoudige strings die niet zijn gecomprimeerd of gecodeerd, in plaats van strings
je kunt het onderstaande gebruiken
grep -a STRING file.pdf cat -v file.pdf | grep STRING
Van 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
en cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
Antwoord
gpdf is misschien wat je nodig hebt als je Gnome gebruikt ! Controleer dit voor het geval je “Gnome niet gebruikt. Het heeft een lijst met CLI pdf-viewers. Dan kun je grep
gebruiken om een patroon te vinden.
Antwoord
pdfgrep -r --include "*.pdf" -i "pattern"
Reacties
- Welkom op de site en bedankt u voor uw bijdrage. Kunt u wat uitleg toevoegen over wat deze opties betekenen? Dit kan ook helpen verklaren hoe uw benadering verschilt van andere antwoorden op deze vraag die ook
pdfgrep
aanbevelen.
Antwoord
De snelste manier is
grep -rinw "pattern" --include \*.pdf *
Reacties
- Welkom op de site. Zou u het erg vinden om meer uitleg toe te voegen aan uw voorgestelde oplossing om deze toegankelijker te maken voor niet-experts? Uw
grep
opdrachtregel zoekt bijvoorbeeld recursief in submappen waarvan iemand die niet bekend is metgrep
wellicht niet weet. Je hebt ook de vlag-i
toegevoegd, hoewel het negeren van de hoofdletter niet altijd is wat de gebruiker wil. Leg daarnaast uit op welke manier uw aanpak verschilt van de vraag van bijv. @phuclv en anderen. - Zoals AdminBee zegt, is de vraag niet hoofdlettergevoelig of recursief zoeken in de directory. De
-n
en-w
opties worden ook niet gerechtvaardigd door de vraag. Maar wat nog belangrijker is, dit antwoord vertelt hoe je door tekstbestanden kunt zoeken waarvan de naam eindigt op.pdf
– je hebt het punt van de vraag gemist.
Antwoord
less mypdf.pdf | grep "Hello, World"