Come cercare i contenuti di più file pdf?


227

Come posso cercare i contenuti dei file PDF in una directory / sottodirectory? Sto cercando alcuni strumenti da riga di comando. Sembra che grepnon sia possibile cercare file PDF.


5
Grep non funzionerà poiché il PDF è un formato binario e il testo viene spesso compresso o codificato in vari modi.
segna stephens il

4
Ecco una soluzione GUI: Adobe Reader, vedi wikispaces.psu.edu/display/training/…
Martin Thoma


3
Adobe Reader funziona bene, ma non indicizza; quindi se hai molti file, sarà lento. Qualche soluzione di indicizzazione?
Ruby,

Risposte:


211

La tua distribuzione dovrebbe fornire un'utilità chiamata pdftotext:

find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;

Il "-" è necessario per avere l'output di pdftotext su stdout, non sui file. Le opzioni --with-filenamee --label=inseriranno il nome del file nell'output di grep. Il --colorflag opzionale è carino e dice a grep di produrre usando i colori sul terminale.

(In Ubuntu, pdftotextè fornito dal pacchetto xpdf-utilso poppler-utils.)

Questo metodo, usando pdftotexte grep, ha un vantaggio rispetto pdfgrepse si desidera utilizzare funzionalità di GNU grepche pdfgrepnon supportano. Nota : pdfgrep-1.3.x supporta l' -Copzione per la stampa della linea di contesto.


1
@Kurt Pfeifle La modifica "(Modifica di -kp-)" effettuata non funziona poiché grepfiltra i nomi dei file stampati.
Raphael Ahrens,

@sjr no, mentre la pdfgrepsoluzione è buona per ricerche molto rapide e semplici, spesso voglio ottenere un po 'di contesto, dato che una sola riga non sarà abbastanza utile - così come ho aggiunto a questa risposta: ad esempio, puoi aggiungere l'opzione -C5 prima di "il tuo modello" per includere 5 righe di contesto nell'output - pdfgrep non supporta questo
Colin D Bennett

oh, è bello, felice di sapere che ci sono dei vantaggi, anche se è molto meno ovvio per la maggior parte delle persone che sta facendo
sjr

2
@sjr Solo per la cronaca: sto usando Ubuntu 12.10 ed pdfgrepè inutile, riporta un'enorme quantità di immondizia sui file che non può gestire. La tua soluzione d'altro canto ha aiutato. Quindi per favore non cancellarlo, anche dopo 3 anni è ancora utile!
Ali,

Sono stato in grado di usarlo anche in Cygwin, anche se per renderlo una funzione con il parametro ho dovuto fare in modo che "your_pattern" diventasse "$ 1"
Koshmaar,

215

C'è pdfgrep , che fa esattamente ciò che suggerisce il suo nome.

pdfgrep -R 'a pattern to search recursively from path' /some/path

L'ho usato per ricerche semplici e ha funzionato bene.

(Ci sono pacchetti in Debian, Ubuntu e Fedora.)

Dalla versione 1.3.0 pdfgrep supporta la ricerca ricorsiva. Questa versione è disponibile in Ubuntu da Ubuntu 12.10 (Quantal).


1
Da Natty (Ubuntu 11.04) in poi (Vedi pacchetti.ubuntu.com/… )
Martin Thoma

2
@pavon pdfgrepora ha quell'opzione di ricorsione, incluso -Rseguire anche i collegamenti simbolici
Tobias Kienzler,

30

Recoll è una fantastica applicazione di ricerca GUI full-text per Unix / Linux che supporta dozzine di formati diversi, incluso il PDF. Può persino passare il numero di pagina esatto e il termine di ricerca di una query al visualizzatore di documenti e quindi consente di passare al risultato direttamente dalla sua GUI.

Recoll include anche un'interfaccia della riga di comando valida e un'interfaccia del browser Web .


1
@Glutanimate Sarebbe d'aiuto (io e forse anche altri) se potessi aggiungere un esempio pertinente alla domanda originale (strumento da riga di comando per la ricerca di più pdf): Vorrei anche vedere come eseguire una ricerca con caratteri jolly e come cercare la directory corrente che include tutte le sottodirectory . Che aspetto avrebbe recoll / xapiannella riga di comando (non GUI)? Grazie!
pazzo per il natty

@ LeszekŻarna Forse potresti pubblicare l'esempio che hai testato?
pazzo per il natty

Il recoll manuale dell'utente potrebbe contenere alcuni suggerimenti, ma offre una lettura piuttosto tecnica e "off-topic" ...
nocciola circa natty

1
@nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - stackoverflow ha mangiato i backtick attorno a pwd.
medoc

13

La mia versione attuale di pdfgrep (1.3.0) consente quanto segue:

pdfgrep -HiR 'pattern' /path

Quando si fa pdfgrep --help:

  • H: Stampa il nome del file per ogni corrispondenza.
  • i: ignora le distinzioni tra maiuscole e minuscole.
  • R: Cerca ricorsivamente nelle directory.

Funziona bene sul mio Ubuntu.


7

Ho realizzato questa piccola sceneggiatura distruttiva . Divertiti con esso.

function pdfsearch()
{
    find . -iname '*.pdf' | while read filename
    do
        #echo -e "\033[34;1m// === PDF Document:\033[33;1m $filename\033[0m"
        pdftotext -q -enc ASCII7 "$filename" "$filename."; grep -s -H --color=always -i $1 "$filename."
        # remove it!  rm -f "$filename."
    done
}

2
+1. Ma invece di $filename.te dovresti inserirlo grep.
Raphael Ahrens,

3

Mi piace la risposta di @ sjr, tuttavia preferisco xargs vs -exec. Trovo gli xarg più versatili. Ad esempio con -P possiamo sfruttare più CPU quando ha senso farlo.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"

punto interessante sulla xargs"capacità di elaborazione parallela". Nota che il tuo --labelargomento opzione sarà letteralmente {} , perché il grepcomando ora non è più eseguito nel contesto di find's exec.
mklement0

2

Ho avuto lo stesso problema e quindi ho scritto uno script che cerca una stringa in tutti i file pdf nella cartella specificata e stampa i file PDF corrispondenti alla stringa della query.

Forse questo ti sarà utile.

Puoi scaricarlo qui


forse utile inserire la sceneggiatura nel commento?
baxx,

ho provato il tuo script e risulta molto più lento della pdfgrepsoluzione o del one-liner di sjr, e mi ha lasciato con un processo in corso usando il 100% di un thread della CPU anche dopo aver premuto Ctrl-C per terminarlo.
Jason,

2

Se vuoi vedere i nomi dei file con pdftotext usa il seguente comando:

find . -name '*.pdf' -exec echo {} \; -exec pdftotext {} - \; | grep "pattern\|pdf" 

2

C'è un'altra utility chiamata ripgrep-all , che si basa su ripgrep .

Può gestire molto più di documenti PDF, come documenti e film di Office, e l'autore afferma che è più veloce di pdfgrep.

Sintassi dei comandi per la ricerca ricorsiva della directory corrente e la seconda limita solo ai file PDF:

rga 'pattern' .
rga --type pdf 'pattern' .

1

Esiste uno strumento grep open source open source crgrep che cerca all'interno di file PDF ma anche altre risorse come contenuto nidificato in archivi, tabelle di database, metadati di immagini, dipendenze di file POM e risorse Web - e combinazioni di questi tra cui la ricerca ricorsiva.

La descrizione completa nella scheda File copre praticamente ciò che supporta lo strumento.

Ho sviluppato crgrep come strumento opensource.


Craig - hai una connessione con quel progetto? In tal caso, dovresti indicarlo nella tua risposta. Lo dico perché hai appena pubblicato una risposta praticamente identica ad altre due vecchie domande ...
Stephen C,

Post aggiornato per chiarire che sono l'autore di crgrep
Craig,

1

Per prima cosa converti tutti i tuoi file pdf in file di testo:

for file in *.pdf;do pdftotext "$file"; done

Quindi utilizzare grepnormalmente. Questo è particolarmente utile in quanto è veloce quando si hanno più query e molti file PDF.


Questo, se fatto in combinazione con ag github.com/ggreer/the_silver_searcher . In grado di analizzare psicedeliks Gb di microsecondi. File flat per la vita
NVRM

0

Hai bisogno di alcuni strumenti come pdf2text per convertire prima il tuo pdf in un file di testo e poi cercare all'interno del testo. (Probabilmente ti mancheranno alcune informazioni o simboli).

Se stai usando un linguaggio di programmazione, probabilmente ci sono librerie pdf scritte per questo scopo. ad es. http://search.cpan.org/dist/CAM-PDF/ per Perl


0

prova a usare 'acroread' in un semplice script come quello sopra

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.