Narzędzie wiersza polecenia do wyszukiwania fraz w dużej liczbie plików pdf

9

Korzystam z opensuse 10.3 i lubię znać narzędzia wiersza poleceń do wyszukiwania wyrażeń w dużej liczbie plików pdf w katalogu. W systemie Windows XP wyszukiwanie w Eksploratorze pozwala na to, ale jest zbyt wolne. Czy są tu jakieś wskazówki grep?

lodziarz
źródło
wingrep.com ! :)
Apache,
Chcę najpierw poznać narzędzia wiersza poleceń, a jeśli są narzędzia GUI, to też będzie fajne .. Wingsrep działa tylko w systemie Windows. I chcę przeszukiwać tylko pliki pdf, więc miło byłoby mieć aplikację zoptymalizowaną do tego celu
iceman
1
Podobne pytanie na Unix Stack Exchange
Gilles „SO- przestań być zły”

Odpowiedzi:

6
SEARCH_DIR = "/ some / dir / where / you / want / to / search /";
SEARCH_STRING = "cokolwiek szukasz";
# wyodrębnianie tekstu z pdf
pdftotext „plik.pdf” „plik.txt”

# łączenie się z grep
pdftotext "plik.pdf" / dev / stdout | grep -H --label = "plik.pdf" - "$ SEARCH_STRING"

# jeśli chcesz, aby grep wyświetlał tylko listę pasujących plików pdf, dodaj --files-with-mecze
pdftotext "plik.pdf" / dev / stdout | grep -H --label = "plik.pdf" - pliki z dopasowaniami - "$ SEARCH_STRING"

# znajdź możliwą listę pdf do wyszukiwania
znajdź „$ SEARCH_DIR” -typ f-name '* .pdf'> list-of-pdf.txt
# do wszystkiego dołącza awk jako taśma klejąca, wysyłana do bash w celu przetworzenia
# podwójny cytat jest zastępowany jako x22 wewnątrz awk.
znajdź „$ SEARCH_DIR” -typ f-name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{
print "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22"
} '| bash

# Bez uderzenia. Dalszy proces dostosowujący do twoich potrzeb
znajdź „$ SEARCH_DIR” -typ 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";
podczas gdy (EXEC | getline ret) {
 print „Dla pliku [„ $ 0 ”] mamy dopasowanie [„ ret ”]”;
 # rób, co chcesz. 
};
zamknij (EXEC);
} ”
użytkownik42723
źródło
Wydaje mi się, że nie zauważyłeś części pytania, która dotyczyła „Windows XP” lub tagu windows-search . Wiem, że pytanie (mylone) zaczęło się od „openSUSE” , ale istnieje więcej odniesień do Windows niż do Linuksa; zwłaszcza, gdy policzysz również jego kolejny komentarz .
Synetech,
@ Synetech: Odrzucił odpowiedź „Wingrep jest tylko pod Windows”, co sugeruje, że chce rozwiązania dla Linuksa.
Ślimak mechaniczny
@Mechanicalsnail, odrzucił go, ponieważ jest to narzędzie GUI, w którym poprosił o narzędzie wiersza polecenia.
Synetech,
3

W systemie Linux i Windows można używać programu Acrobat Reader, który ma polecenie przeszukiwania wielu plików.

Pod Linuksem istnieje Recoll, który utworzy indeks twoich plików pdf (i więcej) przy pierwszym uruchomieniu. Po zbudowaniu indeksu wyszukiwanie słów powinno być bardzo szybkie; wyszukiwanie fraz powinno być rozsądne. Upewnij się, że pdftotextpolecenie jest zainstalowane przed uruchomieniem Recoll; pod Debianem i Ubuntu jest w poppler-utilspakiecie, nie wiem o Suse.

Lub możesz bezpośrednio przekonwertować pliki na tekst i użyć grep w plikach tekstowych za pomocą poniższych poleceń.

find -name '* .pdf' -exec pdftotext {} \;
grep -r --include '* .txt' -l -F „dokładna fraza do wyszukania”
grep -r --include '* .txt' -l -E "wyrażenie regularne do wyszukiwania"
Gilles „SO- przestań być zły”
źródło
Adobe nie zezwalałby na wyszukiwanie w całym katalogu, robiłoby to tylko w pliku. Chcę najpierw poznać narzędzia wiersza poleceń, a jeśli są narzędzia GUI, to też będzie fajne
iceman
Adobe Reader 9 pod Linuksem ma pozycję menu „Edycja | Szukaj”, która umożliwia wyszukiwanie we wszystkich plikach PDF w katalogu. W wierszu poleceń wszystkie metody, o których wiem, obejmują krok pdftotext(które narzędzia, takie jak Recoll, wykonają automatycznie).
Gilles „SO- przestań być zły”
1
+1 za Przypomnienie. Indeksowanie plików pozwoli zaoszczędzić czas, jeśli masz dużo i często je przeszukujesz.
Ślimak mechaniczny
1

Adobe Reader X spełnia swoje zadanie i to nie umożliwi wyszukanie ramach całego katalogu i podkatalogów, nie tylko wewnątrz pliku, ale nie jest programem wiersza poleceń.

stendabrog
źródło
czy to w najnowszej wersji programu Acrobat X? które wydanie?
iceman
Wypróbowałem narzędzie indeksujące Acrobat i nazwanie go prymitywnym jest komplementem. recollręcznie instalowane w Debianie, teraz próbuję uczynić go użytecznym dla moich pracowników z systemem Windows.
Chris K
0

Aby rekurencyjnie wyświetlić listę wszystkich plików w katalogu domowym, które mają rozszerzenie pliku PDF i zawierają wiersz pasujący do wyrażenia regularnego [iI]n Haskell, na przykład, możesz wydać:

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

Uwagi:

  • Chociaż w tym przykładzie nie jest to szczególnie konieczne, skonstruowałem to, unikając użycia -execlub, xargsponieważ ze względów bezpieczeństwa uważam, że dobrą praktyką jest przyzwyczajenie się do tego. Zmiana „ -execdirna” -execi „ $PWD${0#?}na $0” powinna w tym przypadku osiągnąć ten sam wynik.
  • Zamiast używać globów do dopasowywania wzorców nazw plików, przydatne może być użycie większej mocy ekspresyjnej wyrażeń regularnych i dopasowanie wzorców na całej ścieżce. Umieściłem tutaj praktykę, aby pokazać, jak można to zrobić. Zauważ, że ścieżka dopasowana do wzorca to ścieżka, która normalnie byłaby drukowana. To, czy jest względne czy bezwzględne, zależy od podanych argumentów ścieżki, które jeśli są emitowane domyślnie do bieżącego katalogu roboczego (' ./'). W tym przykładzie wszystkie dopasowane ścieżki są bezwzględne (tzn. Zaczynają się od „ /”), ponieważ „ ~/” jest rozwinięte do bezwzględnej ścieżki do katalogu domowego bieżącego użytkownika i jest to jedyny argument ścieżki.
  • $0” I „ $1” są parametrami pozycyjnymi używanymi w taki sposób, aby poprawnie cytować argumenty. Jeśli nie zostanie to wykonane poprawnie, polecenie jest podatne na dowolne nazwy plików.
  • ${0#?}” usuwa pierwszy znak $0, tzn. „ .”.

Aby wydrukować każdą pasującą linię poprzedzoną nazwą pliku:

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

Ten wariant używa „ -H” zamiast „ -l” i etykietuje nazwę pliku zamiast ścieżki pliku. „ ${0:2}” usuwa pierwsze dwa znaki $0, tj. „ ./”, ale najwyraźniej nie jest rozpoznawany przez sh.

Oczywiście dostosuj do swoich potrzeb.

James Haigh
źródło