Birden fazla pdf dosyasının içeriği nasıl aranır?


227

Bir dizindeki / alt dizindeki PDF dosyalarının içeriğini nasıl arayabilirim? Bazı komut satırı araçları arıyorum. Görünüşe göre grepPDF dosyalarını arayamıyor.


5
PDF ikili bir format olduğundan ve metin genellikle çeşitli şekillerde sıkıştırıldığı veya kodlandığı için Grep çalışmaz.
mark stephens

4
İşte bir GUI çözümü: Adobe Reader, bkz. Wikispaces.psu.edu/display/training/…
Martin Thoma


3
Adobe okuyucu düzgün çalışıyor ancak dizine eklenmiyor; yani çok fazla dosyanız varsa, yavaş olacaktır. Herhangi bir indeksleme çözümü var mı?
Ruby

Yanıtlar:


211

Dağıtımınız şu adla bir yardımcı program sağlamalıdır pdftotext:

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

"-" dosyalara değil, stdout'a pdftotext çıktısı almak için gereklidir. --with-filenameVe --label=seçenekler grep çıkışında dosya adını koyacağız. İsteğe bağlı --colorbayrak güzeldir ve grep'e terminaldeki renkleri kullanarak çıktı vermesini söyler.

(Ubuntu'da, pdftotextpaket xpdf-utilsveya tarafından sağlanır poppler-utils.)

Bu yöntem kullanılarak pdftotextve grepüzerinde bir avantaja sahiptir pdfgrepEğer GNU özelliklerini kullanmak istiyorsanız desteklemez. Not : pdfgrep-1.3.x , bağlam satırını yazdırma seçeneğini destekler .greppdfgrep-C


1
@Kurt Pfeifle grepYazdırdığınız dosya adlarını filtrelediği için yaptığınız "(-kp- ile düzenle)" düzenlemesi çalışmaz .
Raphael Ahrens

@sjr no, pdfgrepçözüm gerçekten hızlı ve basit aramalar için iyi olsa da , çoğu zaman bir bağlam elde etmek istiyorum, çünkü tek bir satır yeterince yardımcı olmayacak - bu yanıta eklediğim gibi: Örneğin, "kalıbınızdan" önceki -C5 seçeneği çıktıya 5 bağlam satırı ekler - pdfgrep bunu desteklemez
Colin D Bennett

oh bu harika, ne yapıyor wtf çoğu insan için çok daha az açık olsa da, bunun avantajları olduğunu bilmek sevindim
sjr

2
@sjr Sadece kayıt için: Ubuntu 12.10 kullanıyorum ve pdfgrepişe yaramazsa, işleyemediği dosyalarda muazzam miktarda çöp rapor ediyor. Öte yandan çözümünüz yardımcı oldu. Bu yüzden lütfen silmeyin, 3 yıl sonra bile yine de yardımcı olur!
Ali

Cygwin'de de kullanabildim, ancak parametre ile bir işlev yapmak için "your_pattern" i "1 $ '' haline getirmek zorunda kaldım
Koshmaar

215

Tam olarak adından da anlaşılacağı gibi pdfgrep var .

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

Basit aramalar için kullandım ve iyi çalıştı.

(Debian, Ubuntu ve Fedora'da paketler var.)

Sürüm 1.3.0 beri pdfgrep özyinelemeli aramayı destekler. Bu sürüm Ubuntu'da kullanılabilir. Ubuntu 12.10 (Quantal).


1
Natty'den (Ubuntu 11.04) yukarı (Bkz. Packages.ubuntu.com/… )
Martin Thoma

2
@pavon pdfgrepşimdi -Rsembolik işaretleri takip etmek de dahil olmak üzere özyineleme seçeneğine sahip
Tobias Kienzler

30

Recoll , PDF dahil onlarca farklı formatı destekleyen Unix / Linux için harika bir tam metin GUI arama uygulamasıdır. Sorgunun tam sayfa numarasını ve arama terimini belge görüntüleyiciye bile aktarabilir ve böylece sonuca doğrudan GUI'sinden atlamanıza olanak tanır.

Recoll ayrıca uygun bir komut satırı arayüzü ve bir web tarayıcı arayüzü ile birlikte gelir .


1
@Glutanimate Orijinal soru ile ilgili bir örnek (birden fazla pdf'nin aranması için komut satırı aracı ) ekleyebilirseniz (ben ve muhtemelen başkaları da) yardımcı olur : Ayrıca joker karakter araması ve nasıl arama yapılacağını görmek istiyorum tüm alt dizinleri dahil olmak üzere geçerli dizin . recoll / xapianBu komut satırında (GUI olmayan) nasıl görünür ? Teşekkürler!
natty hakkında ceviz

@ LeszekŻarna Belki de test ettiğiniz örneği gönderebilirsiniz?
natty hakkında ceviz

recoll Kullanım kılavuzu ... bazı işaretçiler içerebilir, fakat teklifler oldukça teknik ve "konu dışı" okuma
Nutty işe yatkın hakkında

1
@nutty: recoll -t -q dir: pwdext: pdf 'nöro *' - stackoverflow pwd çevresindeki backticks yedi.
medoc

13

Benim pdfgrep (1.3.0) benim gerçek sürümü aşağıdakileri sağlar:

pdfgrep -HiR 'pattern' /path

Yaparken pdfgrep --help:

  • H: Her eşleşme için dosya adını yazdırın.
  • i: Büyük / küçük harf ayrımlarını yoksay.
  • R: Dizinleri özyinelemeli olarak arayın.

Ubuntu'mda iyi çalışıyor.


7

Bu yıkıcı küçük senaryoyu yaptım . Onunla eğlenin.

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. Ama bunun yerine $filename.onu içine almalısın grep.
Raphael Ahrens

3

@ Sjr'ın cevabını seviyorum ama xargs vs -exec'i tercih ediyorum. Xargs'ı daha çok yönlü buluyorum. Örneğin -P ile bunu yapmak mantıklı olduğunda birden fazla CPU'dan yararlanabiliriz.

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

xargs'paralel işleme yeteneği' hakkında ilginç bir nokta . Senin o Not --labelseçeneği-argüman olacak anlamıyla {} çünkü grepkomut artık bağlamında yürütülür find's exec.
mklement0

2

Ben de aynı sorunu vardı ve böylece bir dizede belirtilen klasördeki tüm pdf dosyalarını arar ve sorgu dizesi ile eşleşen PDF dosyalarını yazdırır bir komut dosyası yazdı.

Belki bu size yardımcı olacaktır.

Buradan indirebilirsiniz


komut dosyasına yorum koymak için yararlı olabilir?
baxx

Senaryonuzu denedim ve pdfgrepçözüm veya sjr'ın tek astarından çok daha yavaş çıkıyor ve beni sonlandırmak için bile Ctrl-C sonra% 100 CPU iş parçacığı kullanarak devam eden bir işlemle bıraktı.
Jason

2

Pdftotext ile dosya adlarını görmek istiyorsanız aşağıdaki komutu kullanın:

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

2

Ripgrep'i temel alan ripgrep -all adında başka bir yardımcı program daha vardır .

Office belgeleri ve filmler gibi PDF belgelerinden daha fazlasını işleyebilir ve yazar bunun daha hızlı olduğunu iddia eder pdfgrep.

Geçerli dizini özyinelemeli olarak aramak için komut sözdizimi ve ikincisi yalnızca PDF dosyalarıyla sınırlanır:

rga 'pattern' .
rga --type pdf 'pattern' .

1

PDF dosyalarında arama yapan açık kaynaklı bir ortak kaynak grep aracı crgrep , aynı zamanda arşivlerde iç içe geçmiş içerik, veritabanı tabloları, görüntü meta verileri, POM dosya bağımlılıkları ve web kaynakları - ve bunların yinelemeli arama dahil kombinasyonları.

Dosyalar sekmesinin altındaki tam açıklama, aracın desteklediğini hemen hemen kapsar.

Bir açık kaynak aracı olarak crgrep geliştirdim.


Craig - bu projeyle bir bağlantın var mı? Eğer öyleyse, cevabınızda belirtmelisiniz. Bunu söylüyorum, çünkü diğer iki eski soruya neredeyse aynı bir cevap gönderdiniz ...
Stephen C

Crgrep
Craig

1

Öncelikle tüm pdf dosyalarınızı metin dosyalarına dönüştürün:

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

Sonra grepnormal olarak kullanın . Bu, özellikle birden fazla sorgunuz ve çok sayıda PDF dosyanız olduğunda hızlı olduğu için iyidir.


Bu, ag github.com/ggreer/the_silver_searcher ile birlikte yapıldığında . Psychedeliks Gb'de mikrosaniye ile ayrıştırılabilir. Yaşam için düz dosyalar
NVRM

0

Önce pdf'nizi bir metin dosyasına dönüştürmek ve sonra metnin içinde arama yapmak için pdf2text gibi bazı araçlara ihtiyacınız vardır. (Muhtemelen bazı bilgileri veya sembolleri özleyeceksiniz).

Bir programlama dili kullanıyorsanız, muhtemelen bu amaçla yazılmış pdf kütüphaneleri vardır. ör . Perl için http://search.cpan.org/dist/CAM-PDF/


0

yukarıdaki gibi basit bir komut dosyasında 'acroread'i kullanmayı deneyin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.