2011-01-10 20 views
174

Jak mogę przeszukać zawartość plików PDF w katalogu/podkatalogu? Szukam niektórych narzędzi wiersza poleceń. Wygląda na to, że grep nie może wyszukiwać plików PDF.Jak wyszukiwać zawartość wielu plików pdf?

+4

Grep nie będzie działał, ponieważ plik PDF jest formatem binarnym, a tekst jest często kompresowany lub kodowany na różne sposoby. –

+2

Oto rozwiązanie GUI: Adobe Reader, zobacz https://wikispaces.psu.edu/display/training/Search+for+Text+in+Multiple+PDFs+z+Adobe+Reader –

+2

Powiązane: http: // unix .stackexchange.com/questions/6704/grep-pdf-files – Flow

Odpowiedz

157

Twoja dystrybucja powinna dostarczyć narzędzie o nazwie pdftotext:

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

przycisk "-" jest konieczne, aby mieć wyjście pdftotext na standardowe wyjście, a nie pliki. Opcje --with-filename i --label= umieszczą nazwę pliku na wyjściu grep. Opcjonalna flaga --color jest niezła i mówi grep, aby wyświetlała kolory za pomocą terminala.

(w Ubuntu, pdftotext jest dostarczane przez pakiet xpdf-utils lub poppler-utils.)

Ta metoda, za pomocą pdftotext i grep, ma przewagę nad pdfgrep jeśli chcesz korzystać z funkcji GNU grep że pdfgrep nie wsparcie. Uwaga: pdfgrep-1.3.x obsługuje opcję -C do drukowania linii kontekstu.

+3

Działa to, ale nie pokazuje pasujących nazw plików. Dowolny pomysł? –

+1

@Kurt Pfeifle Edytowana "(Edycja przez -kp-)", którą stworzyłeś, nie działa, ponieważ 'grep' filtruje nazwy drukowanych plików. –

+0

@sjr nie, natomiast rozwiązanie 'pdfgrep' jest dobre dla naprawdę szybkich i prostych wyszukiwań, często chcę uzyskać jakiś kontekst, ponieważ pojedyncza linia nie będzie wystarczająco pomocna - tak jak dodałem do tej odpowiedzi: Na przykład , możesz dodać opcję -C5, zanim "twój wzór" będzie zawierał 5 linii kontekstu do wyjścia - pdfgrep nie obsługuje tego –

0

Potrzebne są narzędzia takie jak pdf2text, aby najpierw przekonwertować plik PDF na plik tekstowy, a następnie wyszukać w tekście. (Prawdopodobnie przegapisz jakieś informacje lub symbole).

Jeśli używasz języka programowania, prawdopodobnie istnieją w tym celu biblioteki pdf. na przykład http://search.cpan.org/dist/CAM-PDF/ dla Perl

-1

spróbować użyć „acroread” w prosty skrypt jak ten powyżej

164

Jest pdfgrep, który robi dokładnie to, co sugeruje jego nazwa.

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

Użyłem go do prostych wyszukiwań i działało dobrze.

(Istnieją pakiety w Debianie, Ubuntu i Fedory.)

Od wersji 1.3.0 pdfgrep obsługuje rekurencyjne przeszukiwanie. Ta wersja jest dostępna w Ubuntu od wersji Ubuntu 12.10 (Quantal).

+1

Od Natty (Ubuntu 11.04) w górę (patrz http://packages.ubuntu.com/search? keywords = pdfgrep & searchon = names & suite = all & section = all) –

+1

@pavon 'pdfgrep' ma teraz tę opcję rekursji, w tym' -R', aby śledzić również dowiązania symboliczne –

7

Zrobiłem ten mały skrypt niszczący. Baw się dobrze.

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. Ale zamiast '$ filename' powinieneś użyć go do' grep'. –

2

miałem ten sam problem i dlatego napisałem skrypt, który wyszukuje wszystkie pliki PDF w określonym folderze na sznurku i drukuje pliki PDF wich dopasowane ciąg kwerendy.

Może to ci pomoże.

można go pobrać here

+0

może warto umieścić skrypt w komentarzu? – baxx

2

Jeżeli chcesz zobaczyć nazwy plików z pdftotext użycia polecenia:

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

Wyświetla również nazwę pliku bez wzorca, ale jest przydatny. – Raghav

20

Recoll jest fantastycznym pełnotekstowego aplikacja wyszukiwania GUI dla Unix/Linux obsługuje dziesiątki różnych formatów, w tym PDF. Może nawet przekazać dokładny numer strony i wyszukiwany termin zapytania do przeglądarki dokumentów, dzięki czemu można przeskoczyć do wyniku bezpośrednio z jego GUI.

Recoll jest również wyposażony w wydajny interfejs wiersza poleceń i web-browser interface.

+0

Testowany, działa poprawnie. Dzięki –

+1

@Glutanimate Pomoże (ja i ​​ewentualnie inni), jeśli możesz dodać ** przykład ** odnoszące się do pierwotnego pytania * (narzędzie wiersza poleceń do wyszukiwania wielu pdf): * Chciałbym również zobaczyć, jak wykonać ** wyszukiwanie wieloznaczne ** i jak przeszukać ** katalog bieżący zawierający wszystkie podkatalogi **. Jak by to wyglądało z 'recoll/xapian' w linii poleceń (nie GUI)? Dzięki! –

+0

@ LeszekŻarna Być może mógłbyś opublikować przykład, który testowałeś? –

1

Istnieje ogólnodostępne narzędzie open source grep crgrep, które przeszukuje pliki PDF, ale także inne zasoby, takie jak zawartość zagnieżdżona w archiwach, tabele bazy danych, metadane obrazu, zależności pliku POM i zasoby sieciowe - oraz ich kombinacje, w tym rekursywne Szukaj.

Pełny opis w zakładce Pliki prawie obejmuje obsługę tego narzędzia.

Opracowałem crgrep jako narzędzie opensource.

+0

Craig - czy masz połączenie z tym projektem? Jeśli tak, powinieneś o tym powiedzieć w swojej odpowiedzi. Mówię to, ponieważ właśnie wysłałeś praktycznie identyczną odpowiedź na dwa inne stare pytania ... –

+0

Zaktualizowany wpis, aby wyjaśnić, że jestem autorem crgrep – Craig

9

Moja rzeczywista wersja pdfgrep (1.3.0) pozwala na następujące:

pdfgrep -HiR 'pattern' /path 

Podczas pdfgrep --help:

  • H: Broszura nazwę pliku dla każdego meczu.
  • i: Ignoruj ​​rozróżnianie wielkości liter.
  • R: Wyszukiwanie katalogów rekursywnie.

Działa dobrze na moim Ubuntu.

2

Lubię odpowiedź @ sjra, ale wolę xargs vs -exec. Uważam, że xargs jest bardziej wszechstronny. Na przykład z -P możemy skorzystać z wielu procesorów, kiedy ma to sens.

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

interesujący punkt o możliwości przetwarzania równoległego 'xargs'. Zauważ, że twój argument opcji "--label" będzie _literally_ '{}', ponieważ polecenie 'grep' nie jest już wykonywane w kontekście' find' '' exec'. – mklement0

1

najpierw przekonwertować wszystkie pliki PDF do plików tekstowych:

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

Następnie użyj grep jako normalne. Jest to szczególnie dobre, ponieważ jest szybkie, gdy masz wiele zapytań i dużo plików PDF.

+0

To, w połączeniu z 'ag' https://github.com/ggreer/the_silver_searcher. Potrafi analizować psychedeliks Gb o mikrosekundach. Płaskie pliki na całe życie – Cryptopat

Powiązane problemy