Czy istnieje sposób na przeszukiwanie plików PDF za pomocą grep, bez wcześniejszej konwersji na tekst w Ubuntu?

Komentarze

Odpowiedź

Zainstaluj pakiet pdfgrep, a następnie użyj polecenia:

find /path -iname "*.pdf" -exec pdfgrep pattern {} + 

—— ————

Najprostszy sposób:

pdfgrep "pattern" *.pdf pdfgrep "pattern" file.pdf 

Komentarze

  • Działa to również w systemie Mac OSX (Mavericks). Zainstaluj go za pomocą naparu. Prosty. Dzięki.
  • Z ciekawości sprawdziłem źródło pdfgrep i używa on popplera do wyodrębnienia ciągów z pdf. Prawie dokładnie tak, jak odpowiedź @wag ' tylko na stronie, a nie w całym dokumencie.
  • pdfgrep również ma flagę rekurencyjną. Więc ta odpowiedź może być zredukowana do: pdfgrep -R pattern /path/. Chociaż może być mniej efektywne, jeśli przejdzie przez każdy plik, nawet jeśli nie jest to ' t PDF. Zauważyłem, że występują problemy ze znakami międzynarodowymi, takimi jak å, ä i ö .
  • Właściwie opcja -n jest zaletą dla pdfgrep, ponieważ umożliwia dołączenie numeru strony do wyniku (może być pomocna przy dalszym przetwarzaniu).
  • Ta odpowiedź byłaby łatwiejsza w użyciu, gdyby wyjaśniała, które bity polecenia mają być kopiowane dosłownie, a które są symbolami zastępczymi. Jakie ' s pattern? Jakie ' s {}? Co ' jest z „+”? Nie mam pojęcia po pierwszym czytaniu … więc chyba przechodzę do strony podręcznika.

Odpowiedź

Jeśli masz zainstalowany poppler-utils (domyślnie na Ubuntu Desktop), możesz go „przekonwertować” w locie i przesłać do grep :

pdftotext my.pdf - | grep "pattern" 

To nie „nie utworzy pliku .txt.

Komentarze

  • więc … wyodrębniasz tekst przed jego grepowaniem, co oznacza, że odpowiedź brzmi ” no „.
  • @akira OP prawdopodobnie oznaczał ” bez otwierania pliku PDF w przeglądarce i eksportowania do tekstu ”
  • @akira Gdzie widzisz ” tylko grep „?
  • @akira Cóż, już powiedziałem, co myślę prawdopodobnie miał na myśli; nie ' nie chce eksportować do tekstu przed jego przetworzeniem. Bardzo wątpię, czy ma problem z jakimkolwiek poleceniem, które nverts na tekst w jakikolwiek sposób; nie ma ' nie ma powodu, aby tego nie robić
  • @sherrellbc Drugi argument pdftotext to nazwa pliku, do którego powinien zapisywać . Jednak zgodnie z konwencją narzędzia zazwyczaj umożliwiają zapisywanie do stdout zamiast do pliku, podając zamiast tego -. Podobnie, niektóre narzędzia domyślnie zapisałyby do stdout, jeśli całkowicie pominiesz taki argument (ale nie zawsze jest to możliwe bez tworzenia niejednoznaczności).

Odpowiedź

pdfgrep został napisany właśnie w tym celu i jest dostępny w Ubuntu.

Stara się być w większości zgodna z grep i dlatego zapewnia „moc grepa”, specjalizującą się tylko w plikach PDF. Obejmuje to typowe opcje grep, takie jak --recursive, --ignore-case lub --color.

W przeciwieństwie do pdftotext | grep, pdfgrep może wyświetlać numer strony dopasowania w wydajny sposób i jest generalnie szybszy, gdy nie musi przeszukiwać całego dokumentu (np. --max-count lub --quiet).

Podstawowe użycie to:

pdfgrep PATTERN FILE.. 

gdzie PATTERN to szukany ciąg, a FILE lista nazw plików (lub symboli wieloznacznych w powłoce).

Zobacz stronę podręcznika , aby uzyskać więcej informacji.

Odpowiedź

Nie.

Plik PDF składa się z fragmentów danych, niektóre z nich są tekstem, niektóre z nich to zdjęcia, a niektóre z nich to naprawdę magiczne, fantazyjne XYZ (np. pliki .u3d). fragmenty są najczęściej kompresowane (np. flat, zaznacz http://www.verypdf.com/pdfinfoeditor/compression.htm ). Aby „grep” a . pdf, musisz odwrócić kompresję, czyli wyodrębnić tekst.

Możesz to zrobić albo dla pliku za pomocą narzędzi takich jak pdf2text i grep wynik, lub uruchomić „indeksator” (spójrz na xapian.org lub lucene ), który tworzy przeszukiwalny indeks z twoich plików .pdf, a następnie możesz użyć narzędzia wyszukiwarki tego indeksatora, aby uzyskać zawartość pliku PDF.

Ale nie, nie możesz grep plików PDF i mieć nadzieję na wiarygodne odpowiedzi bez wyodrębniania tekstu pierwszy.

Komentarze

  • Biorąc pod uwagę, że pdfgrep istnieje (patrz wyżej), płaskie no ” jest nieprawidłowe.
  • @JonathanCross, biorąc pod uwagę, że pytanie brzmi ” używając potęgi grep, bez konwersji najpierw na tekst „, płaska ” nie ” jest poprawne.

Odpowiedź

Przypomnij sobie może wyszukiwać pliki PDF. Nie obsługuje wyrażeń regularnych, ale ma wiele innych opcji wyszukiwania, więc może pasować do Twoich potrzeb.

Odpowiedź

Istnieje zduplikowane pytanie w StackOverflow. Ludzie tam sugerują odmianę odpowiedzi harish.venkarts:

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

W porównaniu z podobną odpowiedzią, --with-filename flaga dla grepa. Jest to również nieco lepsze od pdfgrep, ponieważ standardowe grep ma więcej funkcji.

https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files

Komentarze

  • Myślę, że byłoby lepiej zostawić to jako komentarz (lub edytuj) w podobnej odpowiedzi, do której się odnosisz.

Odpowiedz

Spójrz we wspólnym narzędziu grep do zasobów crgrep , które obsługuje wyszukiwanie w plikach PDF.

Umożliwia także wyszukiwanie innych zasobów, takich jak zawartość zagnieżdżona w archiwach, stoły , metadane obrazu, zależności plików POM i zasoby sieciowe – oraz ich kombinacje, w tym wyszukiwanie rekurencyjne.

Odpowiedź

Możesz przepuść go przez strings najpierw: –

cat file.pdf | strings | grep <...etc...> 

Komentarze

  • Po prostu użyj strings file.pdf | grep <...>, nie ' nie potrzebujesz cat
  • Tak – wydaje mi się, że mój umysł działa lepiej ze strumieniami … 🙂
  • nie będzie działać, jeśli tekst jest skompresowany, co dzieje się w większości przypadków.
  • Nawet jeśli tekst jest nieskompresowany, ' to zazwyczaj małe fragmenty zdań (niekoniecznie całe słowa!), dokładnie wymieszane z informacjami dotyczącymi formatowania. Niezbyt przyjazne dla strings lub grep.
  • Czy możesz wymyślić inny powód, dla którego użycie do tego ciągów znaków nie byłoby ' t działa? Zauważyłem, że używanie ciągów znaków działa na niektórych plikach PDF, ale nie na innych.

Odpowiedź

spróbuj tego

find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \ pdftotext "$i" - | grep pattern; done 

przy drukowaniu linii wzorzec występuje wewnątrz pliku PDF

Odpowiedź

Oto krótki skrypt do wyszukiwania plików PDF w bieżącym katalogu:

#!/bin/bash if [ $# -ne 1 ]; then echo "usage $0 VALUE" 1>&2 exit 1 fi echo "SEARCH IS CASE SENSITIVE" 1>&2 find . -name "*.pdf" -exec /bin/bash -c "pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"" "$1" \; 

Komentarze

  • Nie mogę tego edytować, ponieważ jest za mało: $1 w wywołaniu wyszukiwania powinno być cytowane, w przeciwnym razie wygra ' t nie działa z wyszukiwaniem terminy ze spacjami.
  • @ankon naprawił to 🙂

Odpowiedz

cd do folder zawierający plik PDF, a następnie ..

pdfgrep "pattern" your.pdf 

lub jeśli chcesz wyszukiwać w więcej niż jednym pliku PDF (np. we wszystkich plikach PDF pliki w folderze)

pdfgrep "pattern" `ls *.pdf` 

lub

pdfgrep "pattern" $(ls *.pdf) 

Komentarze

  • dlaczego na ziemi, czy używasz ls do umieszczania nazw plików w parametrach? ' jest nie tylko wolniejsze, ale też złym pomysłem jest użycie ls wyjścia jako wejście do innych poleceń . Wystarczy pdfgrep 'pattern' *.pdf
  • @phuclv Mylisz się. pdfgrep 'pattern' *.pdf nie będzie działać.
  • @ f0nzie ' jest źle. $(ls *.pdf) będzie prawie dokładnie taki sam jak *.pdf, tylko gorszy, ponieważ wyjątkowy pliki nie są chronione w cudzysłowach

Odpowiedź

Zakładam, że masz na myśli, aby nie konwertować ich na dysku, może przekonwertować je na stdout, a następnie grepować za pomocą pdftotext. Grepowanie pliku PDF bez jakiejkolwiek konwersji nie jest praktycznym podejściem, ponieważ PDF jest głównie formatem binarnym.

W katalogu:

ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

lub w katalogu i jego podkatalogach:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword" 

Również dlatego, że niektóre pdf to skany, należy je najpierw poddać OCR. Napisałem dość prosty sposób na przeszukiwanie wszystkich plików PDF, które nie mogą być grep ed i OCR.

Zauważyłem, że pdf nie ma żadnej czcionki, której zwykle nie można przeszukiwać. Wiedząc to, możemy użyć pdffonts.

Pierwsze 2 wiersze pdffonts to nagłówki tabeli, więc gdy plik jest przeszukiwany, ma więcej niż dwa wiersze, wiedząc, że możemy utworzyć:

gedit check_pdf_searchable.sh 

następnie wklej to

#!/bin/bash #set -vx if ((`pdffonts "$1" | wc -l` < 3 )); then echo $1 pypdfocr "$1" fi 

i nadaj mu plik wykonywalny

chmod +x check_pdf_searchable.sh 

i wyświetl wszystkie pliki PDF, których nie można przeszukiwać w katalogu:

ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

lub w katalogu i jego podkatalogach:

tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {} 

Odpowiedź

Jeśli chcesz po prostu wyszukać nazwy / właściwości PDF … lub proste ciągi znaków, które nie są skompresowane lub zakodowane, zamiast strings możesz użyć poniższego

grep -a STRING file.pdf cat -v file.pdf | grep STRING 

Od grep --help:

 --binary-files=TYPE assume that binary files are TYPE; TYPE is "binary", "text", or "without-match" -a, --text equivalent to --binary-files=text 

i cat --help:

 -v, --show-nonprinting use ^ and M- notation, except for LFD and TAB 

Odpowiedź

gpdf może być tym, czego potrzebujesz, jeśli „używasz GNOME ! Sprawdź to na wypadek, gdybyś „nie korzystał z Gnome.” Ma listę przeglądarek CLI PDF. Następnie możesz użyć grep, aby znaleźć jakiś wzorzec.

Odpowiedź

 pdfgrep -r --include "*.pdf" -i "pattern"  

Komentarze

  • Witamy w witrynie i dziękujemy za swój wkład. Czy mógłbyś wyjaśnić, co oznaczają te opcje? Może to również pomóc w wyjaśnieniu, czym różni się Twoje podejście od innych odpowiedzi na to pytanie, które również zalecają pdfgrep.

Odpowiedź

Najszybszym sposobem jest

grep -rinw "pattern" --include \*.pdf * 

Komentarze

  • Witamy na stronie. Czy mógłbyś dodać więcej wyjaśnień do proponowanego rozwiązania, aby było ono bardziej dostępne dla osób niebędących ekspertami? Na przykład grep w wierszu poleceń wyszukuje rekursywnie w podkatalogach, których ktoś niezaznajomiony z grep może nie wiedzieć. Dołączono również flagę -i, chociaż ignorowanie wielkości liter może nie zawsze odpowiadać oczekiwaniom użytkownika. Ponadto proszę wyjaśnić, w jaki sposób Państwa podejście różni się od odpowiedzi np. @phuclv i inni.
  • Jak mówi AdminBee, pytanie nie dotyczy wyszukiwania bez rozróżniania wielkości liter ani rekursywnego przeszukiwania katalogu. Opcje -n i -w również nie są uzasadnione pytaniem. Ale co ważniejsze, ta odpowiedź mówi, jak przeszukiwać pliki tekstowe, których nazwy kończą się na .pdf – przegapiłeś sedno pytania.

Odpowiedź

less mypdf.pdf | grep "Hello, World" 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *