C'è un modo per cercare file pdf usando la potenza di grep, senza prima convertirli in testo in Ubuntu?
C'è un modo per cercare file pdf usando la potenza di grep, senza prima convertirli in testo in Ubuntu?
Risposte:
Installa il pacchetto pdfgrep
, quindi usa il comando:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
------
Il modo più semplice è
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
ha anche una bandiera ricorsiva. Quindi questa risposta potrebbe forse essere ridotto a: pdfgrep -R pattern /path/
. Potrebbe essere meno efficace se attraversa tutti i file anche se non è un PDF. E noto che ha problemi con personaggi internazionali come å, ä e ö.
-n
opzione è un pro per pdfgrep in quanto consente di includere il numero di pagina nell'output (potrebbe essere utile per ulteriori elaborazioni).
pattern
? Cosa {}
? Che succede con il `+`? Non ho idea in prima lettura ... quindi vado alla manpage che vado, suppongo.
Se è stato poppler-utils
installato (impostazione predefinita su Ubuntu Desktop), è possibile "convertirlo" al volo e reindirizzarlo a grep
:
pdftotext my.pdf - | grep 'pattern'
Questo non creerà un file .txt.
pdftotext
è il nome del file su cui dovrebbe scrivere. Tuttavia, per convenzione, gli strumenti in genere consentono di scrivere stdout
invece che in un file specificando un -
invece. Allo stesso modo, alcuni strumenti scriveranno di stdout
default se si omette del tutto un tale argomento (ma questo non è sempre possibile senza creare ambiguità).
pdfgrep è stato scritto proprio per questo scopo ed è disponibile in Ubuntu.
Cerca di essere per lo più compatibile grep
e quindi fornisce "il potere di grep", specializzato solo per i PDF. Ciò include opzioni grep comuni, come --recursive
, --ignore-case
o --color
.
Al contrario pdftotext | grep
, pdfgrep può generare il numero di pagina di una corrispondenza in modo performante ed è generalmente più veloce quando non deve cercare l'intero documento (ad es. --max-count
O --quiet
).
L'utilizzo di base è:
pdfgrep PATTERN FILE..
dove si PATTERN
trova la stringa di ricerca e FILE
un elenco di nomi di file (o caratteri jolly in una shell).
Vedi la manpage per maggiori informazioni.
No.
Un pdf è costituito da blocchi di dati, alcuni dei quali testo, alcuni dei quali immagini e alcuni dei quali davvero magici XYZ (ad es. File .u3d). Quei pezzi sono spesso compressi (es. Flat, controlla http://www.verypdf.com/pdfinfoeditor/compression.htm ). Al fine di 'grep' un .pdf si deve invertire la compressione alias 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 costruisce un indice ricercabile dai tuoi file .pdf e quindi puoi usare la ricerca strumenti del motore di quell'indicizzatore per ottenere il contenuto del pdf.
Ma no, non puoi grep
file pdf e sperare in risposte affidabili senza prima estrarre il testo.
pdfgrep
esiste (vedi sopra), un "no" piatto non è corretto.
Potresti strings
prima convogliarlo : -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, non è necessariocat
strings
o grep
.
Dai un'occhiata allo strumento grep delle risorse comuni crgrep che supporta la ricerca all'interno dei file PDF.
Inoltre, consente di cercare altre risorse come contenuto nidificato in archivi, tabelle di database, metadati di immagini, dipendenze di file POM e risorse Web - e combinazioni di queste tra cui la ricerca ricorsiva.
prova questo
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
per la stampa delle linee il motivo si presenta all'interno del pdf
cd nella cartella contenente il file pdf e quindi ..
pdfgrep 'pattern' your.pdf
o se vuoi cercare in più di un solo file pdf (ad es. in tutti i file pdf nella tua cartella)
pdfgrep 'pattern' `ls *.pdf`
o
pdfgrep 'pattern' $(ls *.pdf)
ls
output come input per altri comandi . Appena pdfgrep 'pattern' *.pdf
è sufficiente
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 alla risposta simile qui è la --with-filename
bandiera per grep. Questo è in qualche modo superiore a pdfgrep, perché grep standard ha più funzionalità.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Ecco uno script rapido per la ricerca di 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 \;
Suppongo che intendi tp non convertirlo sul disco, puoi convertirlo in stdout
e quindi 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 OCR. Ho scritto un modo abbastanza semplice per cercare tutti i pdf che non possono essere grep
editati e OCR.
Ho notato che se un pdf
file non ha alcun carattere, di solito non è ricercabile. Quindi sapendo questo possiamo usare pdffonts
.
Le prime 2 righe di pdffonts
sono l'intestazione della tabella, quindi quando un file è ricercabile ha più di due righe di output, sapendo che possiamo creare:
gedit check_pdf_searchable.sh
quindi incollalo
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
quindi renderlo eseguibile
chmod +x check_pdf_searchable.sh
quindi elenca tutti i 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 {}
Se vuoi solo cercare nomi / proprietà pdf ... o semplici stringhe che non sono compresse o codificate, strings
puoi invece usare le seguenti
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