Esiste un modo per cercare file PDF utilizzando la potenza di grep, senza prima convertirli in testo in Ubuntu?
Commenti
- Vedi anche Esiste una sorta di convertitore da PDF a testo? e Strumento a riga di comando per cercare frasi in un gran numero di file pdf .
- Per le persone che arrivano qui tramite ricerca: se desideri convertirlo prima in file di testo, richiedi un guarda Come cercare i contenuti di più file PDF?
Risposta
Installa il pacchetto pdfgrep
, quindi utilizza il comando:
find /path -iname "*.pdf" -exec pdfgrep pattern {} +
—— ————
Il modo più semplice per farlo:
pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf
Commenti
- Funziona anche in mac osx (Mavericks). Installalo usando brew. Semplice. Grazie.
- Per curiosità ho controllato il sorgente di pdfgrep e utilizza poppler per estrarre le stringhe dal pdf. Quasi esattamente come @wag ‘ risponde solo a pagina anziché, presumibilmente, allintero documento.
-
pdfgrep
anche ha un flag ricorsivo. Quindi questa risposta potrebbe forse essere ridotta a:pdfgrep -R pattern /path/
. Anche se potrebbe essere meno efficace se analizza tutti i file anche se ‘ t un PDF. E ho notato che ha problemi con caratteri internazionali come å, ä e ö . - In realtà, lopzione
-n
è un vantaggio per pdfgrep in quanto consente di includere il numero di pagina nelloutput (potrebbe essere utile per ulteriori elaborazioni). - Questa risposta sarebbe più facile da usare se spiegasse quali bit del comando devono essere copiati letteralmente e quali sono segnaposto. Cosa ‘ è
pattern
? Cosa ‘ è{}
? Che succede ‘ con il carattere “+”? Non ho idea della prima lettura … quindi vado alla pagina di manuale, suppongo.
Answer
Se hai poppler-utils
installato (impostazione predefinita su Ubuntu Desktop), puoi “convertirlo” al volo e collegarlo a grep
:
pdftotext my.pdf - | grep "pattern"
Questo non creerà un file .txt.
Commenti
- quindi .. estrai il testo prima di grep, il che significa che la risposta è ” no “.
- @akira LOP probabilmente significava ” senza aprire il PDF in un visualizzatore ed esportarlo in testo ”
- @akira Dove vedi ” solo grep “?
- @akira Beh, ho già detto quello che penso probabilmente intendeva; non ‘ desidera esportare in testo prima di elaborarlo. Dubito fortemente che abbia un problema con qualsiasi comando che co si converte in testo in alcun modo; ‘ non cè motivo per non
- @sherrellbc Il secondo argomento di
pdftotext
è il nome del file in cui scrivere . Tuttavia, per convenzione, gli strumenti in genere consentono di scrivere sustdout
invece che su un file specificando invece un-
. Allo stesso modo, alcuni strumenti scriverebbero instdout
per impostazione predefinita se si omette completamente un argomento del genere (ma ciò non è sempre possibile senza creare ambiguità).
Risposta
pdfgrep è stato scritto esattamente per questo scopo ed è disponibile in Ubuntu.
Cerca di essere per lo più compatibile con grep
e quindi fornisce “la potenza di grep”, specializzato solo per i PDF. Ciò include le opzioni grep comuni, come --recursive
, --ignore-case
o --color
.
A differenza di pdftotext | grep
, pdfgrep può restituire il numero di pagina di una corrispondenza in modo efficiente ed è generalmente più veloce quando non deve cercare lintero documento (ad es. --max-count
o --quiet
).
Lutilizzo di base è:
pdfgrep PATTERN FILE..
dove PATTERN
è la stringa di ricerca e FILE
un elenco di nomi di file (o caratteri jolly in una shell).
Vedere la manpage per ulteriori informazioni.
Risposta
No.
Un pdf è costituito da blocchi di dati, alcuni di loro testo, alcuni di loro immagini e alcuni di loro XYZ di fantasia davvero magici (es. file .u3d). i blocchi sono il più delle volte compressi (ad es. flat, seleziona http://www.verypdf.com/pdfinfoeditor/compression.htm ). Per “grep” a . pdf hai hai per invertire la compressione, ovvero estrarre il testo.
Puoi farlo sia per file con strumenti come pdf2text
e grep il risultato, oppure esegui un “indicizzatore” (guarda xapian.org o lucene ) che crea un indice ricercabile dai tuoi file .pdf e quindi puoi utilizzare il strumenti del motore di ricerca di quellindicizzatore per ottenere il contenuto del pdf.
Ma no, non puoi grep
file pdf e sperare in risposte affidabili senza estrarre il testo prima.
Commenti
- Considerando che
pdfgrep
esiste (vedi sopra), un ” no ” non è corretto. - @JonathanCross, considerando che la domanda dice ” utilizzando la potenza di grep, senza convertire prima in testo “, un piatto ” no ” è corretto.
Risposta
Recoll può eseguire ricerche nei PDF. Non supporta le espressioni regolari, ma ha molte altre opzioni di ricerca, quindi potrebbe soddisfare le tue esigenze.
Risposta
Cè una domanda duplicata su StackOverflow. Le persone lì suggeriscono una variazione della risposta di harish.venkarts:
find /path -name "*.pdf" -exec sh -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"" \;
Il vantaggio rispetto a una risposta simile qui è il --with-filename
flag per grep. Anche questo è in qualche modo superiore a pdfgrep, perché lo standard grep ha più funzioni.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Commenti
- Penso che sarebbe stato meglio lasciare questo come commento (o modifica) nella risposta simile a cui ti riferisci.
Risposta
Dai unocchiata nello strumento grep delle risorse comuni crgrep che supporta la ricerca allinterno di file PDF.
Consente inoltre di cercare altre risorse come contenuti nidificati in archivi, database tavoli , metadati immagine, dipendenze da file POM e risorse web e combinazioni di questi, inclusa la ricerca ricorsiva.
Risposta
Potresti indirizzalo attraverso strings
prima: –
cat file.pdf | strings | grep <...etc...>
Commenti
- Utilizza
strings file.pdf | grep <...>
, ‘ non ti servecat
- Sì, la mia mente sembra funzionare meglio con i flussi … 🙂
- non funzionerà se il testo è compresso, come nella maggior parte dei casi.
- Anche se il testo non è compresso, è ‘ in genere piccoli pezzi di frasi (non necessariamente parole intere!) finemente mescolati con informazioni di formattazione. Non molto amichevole per
strings
ogrep
. - Ti viene in mente un altro motivo per cui usare le stringhe per questo non ‘ non funziona? Ho scoperto che luso delle stringhe funziona su alcuni PDF ma non su altri.
Risposta
prova questo
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done
per stampare le righe il motivo si trova allinterno del pdf
Risposta
Ecco uno script veloce per la ricerca in pdf nella directory corrente:
#!/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" \;
Commenti
- Non posso modificarlo perché è troppo piccolo: il
$1
nella chiamata di ricerca dovrebbe essere citato, altrimenti ‘ non funzionerà con la ricerca termini con spazi. - @ankon ha risolto il problema 🙂
Risposta
cd a la tua cartella contenente il tuo file pdf e poi ..
pdfgrep "pattern" your.pdf
o se vuoi cercare in più di un solo file pdf (ad esempio in tutti i pdf- file nella cartella)
pdfgrep "pattern" `ls *.pdf`
o
pdfgrep "pattern" $(ls *.pdf)
Commenti
- perché sulla terra usi ls per mettere i nomi dei file nei parametri? ‘ non solo è più lento, ma è anche una cattiva idea utilizzare
ls
output come linput ad altri comandi . Bastapdfgrep 'pattern' *.pdf
è sufficiente - @phuclv Ti sbagli.
pdfgrep 'pattern' *.pdf
non funzionerà. - @ f0nzie ‘ ti sbagli.
$(ls *.pdf)
sarà quasi esattamente uguale a*.pdf
, solo peggio perché speciale i file non sono protetti tra virgolette
Risposta
Presumo che tu intenda che tp non convertirlo sul disco, tu può convertirli in stdout
e poi grep con pdftotext
. Grepping del pdf senza alcun tipo di conversione non è un approccio pratico poiché PDF
è principalmente un formato binario.
Nella directory:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
o nella directory e nelle sue sottodirectory:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Inoltre, poiché alcune pdf
sono scansioni, devono prima essere sottoposte a OCR. Ho scritto un modo piuttosto semplice per cercare in tutti i PDF che non possono essere grep
ed eseguire lOCR.
Ho notato se un pdf
non ha alcun carattere, di solito non è ricercabile. Quindi, sapendo questo, possiamo usare pdffonts
.
Le prime 2 righe del pdffonts
sono lintestazione della tabella, quindi quando un file è ricercabile ha più di due righe di output, sapendo questo possiamo creare:
gedit check_pdf_searchable.sh
quindi incolla questo
#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi
quindi rendilo eseguibile
chmod +x check_pdf_searchable.sh
quindi elenca tutto PDF non ricercabili nella directory:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
o nella directory e nelle sue sottodirectory:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Risposta
Se vuoi solo cercare nomi / proprietà PDF … o stringhe semplici che non sono compresse o codificate, invece di strings
puoi utilizzare il seguente
grep -a STRING file.pdf cat -v file.pdf | grep STRING
Da 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
e cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
Risposta
gpdf potrebbe essere ciò di cui hai bisogno se stai utilizzando Gnome ! Controlla questo nel caso in cui “non stai utilizzando Gnome. Ha un elenco di visualizzatori di pdf CLI. Quindi puoi utilizzare grep
per trovare uno schema.
Risposta
pdfgrep -r --include "*.pdf" -i "pattern"
Commenti
- Benvenuto nel sito e grazie per il tuo contributo. Potresti aggiungere qualche spiegazione su cosa significano queste opzioni? Questo potrebbe anche aiutare a spiegare in che modo il tuo approccio differisce da altre risposte a questa domanda che raccomandano anche
pdfgrep
.
Risposta
Il modo più veloce è
grep -rinw "pattern" --include \*.pdf *
Commenti
- Benvenuto nel sito. Ti dispiacerebbe aggiungere più spiegazioni alla tua soluzione proposta per renderla più accessibile ai non esperti? Ad esempio, la tua riga di comando
grep
esegue una ricerca ricorsiva in sottodirectory di cui qualcuno che non ha familiarità congrep
potrebbe non essere a conoscenza. Inoltre, hai incluso il flag-i
sebbene ignorare le maiuscole / minuscole potrebbe non essere sempre ciò che lutente desidera. Inoltre, spiega in che modo il tuo approccio differisce dalla risposta ad es. @phuclv e altri. - Come dice AdminBee, la domanda non richiede una ricerca senza distinzione tra maiuscole e minuscole o una ricerca di directory ricorsiva. Nemmeno le opzioni
-n
e-w
sono giustificate dalla domanda. Ma, cosa più importante, questa risposta spiega come cercare nei file di testo i cui nomi terminano con.pdf
: hai perso il punto della domanda.
Risposta
less mypdf.pdf | grep "Hello, World"