Czy istnieje sposób na przeszukiwanie plików PDF za pomocą grep, bez wcześniejszej konwersji na tekst w Ubuntu?
Komentarze
- Zobacz także Czy istnieje jakiś rodzaj PDF do konwersji tekstu? i Narzędzie wiersza poleceń do wyszukiwania fraz w dużej liczbie plików pdf .
- Dla osób przyjeżdżających tutaj przez wyszukiwanie: jeśli chcesz najpierw przekonwertować je na pliki tekstowe, spójrz na Jak wyszukiwać zawartość wielu plików PDF?
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 dostdout
zamiast do pliku, podając zamiast tego-
. Podobnie, niektóre narzędzia domyślnie zapisałyby dostdout
, 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 potrzebujeszcat
- 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
lubgrep
. - 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ń . Wystarczypdfgrep '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 zgrep
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"