Strumento da riga di comando per cercare frasi in un gran numero di file pdf


9

Sto usando Opensuse 10.3 e mi piace conoscere gli strumenti da riga di comando per cercare frasi in un gran numero di file pdf all'interno di una directory. In Windows XP la ricerca di Explorer lo consente ma è troppo lento. Ci sono consigli grep qui?



Voglio prima conoscere gli strumenti da riga di comando e se ci sono strumenti con GUI, allora sarà anche bello..Wingrep è solo su Windows. E voglio cercare solo i file pdf, quindi un'applicazione ottimizzata per questo sarebbe bello avere
iceman

Risposte:


6
SEARCH_DIR = "/ some / dir / dove / vuoi / tu / a / search /";
SEARCH_STRING = "qualunque-si-sono-ricerca";
# estrazione di testo da pdf
pdftotext "file.pdf" "file.txt"

# connettersi con grep
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING"

# se vuoi che grep mostri solo un elenco di file di file pdf corrispondenti, aggiungi --files-with-match
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --files-with-match - "$ SEARCH_STRING"

# trova un possibile elenco di pdf da cui cercare
trova "$ SEARCH_DIR" -type f -name '* .pdf'> list-of-pdf.txt
# tutto unito da awk come nastro adesivo, inviato a bash per l'elaborazione
# la doppia citazione è sfuggita a x22 in awk.
trova "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{
stampa "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22"
} '| bash

# Senza bash. Ulteriore processo per soddisfare le tue necessità
trova "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '
{
EXEC = "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22";
while (EXEC | getline ret) {
 stampa "Per il file [" $ 0 "] abbiamo corrispondenza [" ret "]";
 # fare quello che ti piace. 
};
chiudi (EXEC);
}'

Suppongo che non abbia notato la parte della domanda che menzionava "Windows XP" o il tag di ricerca di Windows . So che la domanda (confusa) è iniziata con "openSUSE" , ma ci sono più riferimenti di Windows che riferimenti a Linux; soprattutto quando conti anche il suo commento successivo .
Synetech,

@Synetech: ha respinto una risposta con "Wingrep è solo su Windows", il che suggerisce che vuole una soluzione Linux.
Lumaca meccanica

@Mechanicalsnail, l'ha rifiutato perché è uno strumento GUI in cui è stato richiesto uno strumento da riga di comando.
Synetech,

3

In Linux e Windows, è possibile utilizzare Acrobat Reader, che ha un comando per cercare più file.

Sotto Linux, c'è Recoll, che costruirà un indice dei tuoi file pdf (e altro) la prima volta che lo avvii. Dopo aver creato l'indice, le ricerche di parole dovrebbero essere molto veloci; le ricerche di frasi dovrebbero essere ragionevoli. Assicurarsi che il pdftotextcomando sia installato prima di avviare Recoll; sotto Debian e Ubuntu, è nel poppler-utilspacchetto, non so di Suse.

Oppure puoi convertire direttamente i file in testo e utilizzare grep sui file di testo con i comandi seguenti.

find -name '* .pdf' -exec pdftotext {} \;
grep -r --include '* .txt' -l -F "frase esatta da cercare"
grep -r --include '* .txt' -l -E "espressione regolare da cercare"

Adobe non consentirebbe di cercare in un'intera directory, lo farebbe solo all'interno di un file. Voglio prima conoscere gli strumenti da riga di comando e se ci sono strumenti GUI, allora sarà anche bello
iceman

Adobe Reader 9 in Linux ha una voce di menu "Modifica | Cerca" che consente di cercare in tutti i file PDF in una directory. Sulla riga di comando, tutti i metodi di cui sono a conoscenza implicano un passaggio pdftotext(quali strumenti come Recoll eseguiranno automaticamente).
Gilles 'SO- smetti di essere malvagio' il

1
+1 per il richiamo. L'indicizzazione dei file farà risparmiare tempo se ne hai molti e li cerchi frequentemente.
Lumaca meccanica

1

Adobe Reader X fa il lavoro e non consentire la ricerca in un'intera directory e sottodirectory, non solo all'interno di un file, ma non è un programma a riga di comando.


è nell'ultima versione di Acrobat X? quale versione?
iceman

Ho provato lo strumento di indicizzazione di Acrobat e chiamarlo primitivo è un complimento. recollinstallato su debian facilmente, ora cercando di renderlo utilizzabile per i miei dipendenti basati su Windows.
Chris K,

0

Per elencare in modo ricorsivo tutti i file nella tua home directory che hanno l'estensione del file PDF e che contengono una riga che corrisponde alla regex ' [iI]n Haskell', ad esempio, puoi emettere:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

Osservazioni:

  • Sebbene non sia particolarmente necessario per questo esempio, l'ho costruito evitando l'uso -execo xargsperché, per motivi di sicurezza , penso che sia buona abitudine prendere l'abitudine di farlo. La modifica di " -execdir" in " -exec" e " $PWD${0#?}" in " $0" dovrebbe ottenere lo stesso risultato in questo caso.
  • Invece di usare globs per abbinare i nomi dei file, può essere utile usare il maggior potere espressivo delle espressioni regolari e abbinare i pattern su tutto il percorso. Ho incluso la pratica qui per mostrare come si può fare. Si noti che il percorso che corrisponde al modello è il percorso che verrebbe normalmente stampato. Il fatto che sia relativo o assoluto dipende dagli argomenti del percorso indicati, che se emessi di default nella directory di lavoro corrente (' ./'). In questo esempio, i percorsi confrontati sono tutti assoluti (ovvero iniziano con ' /') perché ' ~/' viene espanso nel percorso assoluto della home directory dell'utente corrente ed è l'unico argomento del percorso.
  • ' $0' E ' $1' sono parametri posizionali usati in modo tale da citare correttamente gli argomenti. Se ciò non viene eseguito correttamente, il comando è vulnerabile a nomi di file arbitrari.
  • ' ${0#?}' cancella il primo carattere di $0, ovvero il ' .'.

Per stampare ogni riga corrispondente seguita dal nome file:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

Questa variante utilizza ' -H' anziché ' -l' ed etichette con nome file anziché percorso file. ' ${0:2}' rimuove i primi due caratteri di $0, ovvero il ' ./', ma a quanto pare non è riconosciuto da sh.

Certo, modifica le tue esigenze.

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.