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?
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?
Odpowiedzi:
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); } ”
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 pdftotext
polecenie jest zainstalowane przed uruchomieniem Recoll; pod Debianem i Ubuntu jest w poppler-utils
pakiecie, 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"
pdftotext
(które narzędzia, takie jak Recoll, wykonają automatycznie).
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ń.
recoll
ręcznie instalowane w Debianie, teraz próbuję uczynić go użytecznym dla moich pracowników z systemem Windows.
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:
-exec
lub, xargs
ponieważ ze względów bezpieczeństwa uważam, że dobrą praktyką jest przyzwyczajenie się do tego. Zmiana „ -execdir
na” -exec
i „ $PWD${0#?}
na $0
” powinna w tym przypadku osiągnąć ten sam wynik../
'). 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.