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
pdfgrepha 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 ö.
-nopzione è 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-utilsinstallato (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 stdoutinvece che in un file specificando un -invece. Allo stesso modo, alcuni strumenti scriveranno di stdoutdefault 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 grepe quindi fornisce "il potere di grep", specializzato solo per i PDF. Ciò include opzioni grep comuni, come --recursive, --ignore-caseo --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-countO --quiet).
L'utilizzo di base è:
pdfgrep PATTERN FILE..
dove si PATTERNtrova la stringa di ricerca e FILEun 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 pdf2texte 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 grepfile pdf e sperare in risposte affidabili senza prima estrarre il testo.
pdfgrepesiste (vedi sopra), un "no" piatto non è corretto.
Potresti stringsprima convogliarlo : -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>, non è necessariocat
stringso 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)
lsoutput 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-filenamebandiera 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 stdoute 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 pdfsono scansioni, devono prima essere OCR. Ho scritto un modo abbastanza semplice per cercare tutti i pdf che non possono essere grepeditati e OCR.
Ho notato che se un pdffile non ha alcun carattere, di solito non è ricercabile. Quindi sapendo questo possiamo usare pdffonts.
Le prime 2 righe di pdffontssono 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, stringspuoi 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