Bagaimana cara mencari konten beberapa file pdf?

227

Bagaimana saya bisa mencari konten file PDF dalam direktori / subdirektori? Saya mencari beberapa alat baris perintah. Tampaknya greptidak dapat mencari file PDF.

Jestin Joy
sumber
5
Grep tidak akan berfungsi karena PDF adalah format biner dan teksnya sering dikompresi atau disandikan dengan berbagai cara.
tandai stephens
4
Berikut ini adalah solusi GUI: Adobe Reader, lihat wikispaces.psu.edu/display/training/…
Martin Thoma
3
Adobe reader berfungsi dengan baik, tetapi tidak mengindeks; jadi jika Anda memiliki banyak file, itu akan lambat. Ada solusi pengindeksan?
Ruby

Jawaban:

211

Distribusi Anda harus menyediakan utilitas yang disebut pdftotext:

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

"-" diperlukan untuk memiliki keluaran pdftotext ke stdout, bukan ke file. The --with-filenamedan --label=pilihan akan menempatkan nama file dalam output dari grep. --colorBendera opsional bagus dan memberi tahu grep untuk keluaran menggunakan warna pada terminal.

(Di Ubuntu, pdftotextdisediakan oleh paket xpdf-utilsatau poppler-utils.)

Metode ini, menggunakan pdftotextdan grep, memiliki keunggulan dibandingkan pdfgrepjika Anda ingin menggunakan fitur-fitur GNU grepyang pdfgreptidak mendukung. Catatan : pdfgrep-1.3.x mendukung -Copsi untuk mencetak garis konteks.

sjr
sumber
1
@Kurt Pfeifle Hasil edit "(Edit by -kp-)" yang Anda buat tidak berfungsi karena grepmemfilter nama file yang dicetak.
Raphael Ahrens
@sjr tidak ada, sedangkan pdfgrepsolusi yang baik untuk benar-benar cepat dan pencarian sederhana, sering saya ingin mendapatkan beberapa konteks, sebagai satu baris tidak akan cukup membantu - sehingga saya ditambahkan ke jawaban ini: Misalnya, Anda dapat menambahkan opsi -C5 sebelum "pola Anda" untuk memasukkan 5 baris konteks ke output - pdfgrep tidak mendukung ini
Colin D Bennett
oh itu keren, senang mengetahui ada keuntungan untuk ini meskipun itu jauh lebih jelas bagi kebanyakan orang jika melakukan
sjr
2
@ sjr Sekadar catatan: Saya menggunakan Ubuntu 12.10 dan pdfgreptidak berguna, ia melaporkan sejumlah besar sampah pada file yang tidak dapat ditangani. Solusi Anda di sisi lain membantu. Jadi tolong jangan menghapusnya, bahkan setelah 3 tahun masih membantu!
Ali
Saya dapat menggunakannya juga di cygwin, meskipun untuk membuatnya berfungsi dengan parameter saya harus membuat "your_pattern" menjadi '$ 1'
Koshmaar
215

Ada pdfgrep , yang melakukan persis seperti namanya.

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

Saya telah menggunakannya untuk pencarian sederhana dan bekerja dengan baik.

(Ada paket di Debian, Ubuntu dan Fedora.)

Karena versi 1.3.0 pdfgrep mendukung pencarian rekursif. Versi ini tersedia di Ubuntu sejak Ubuntu 12.10 (Quantal).

Graeme
sumber
1
Dari Natty (Ubuntu 11.04) ke atas (Lihat paket.ubuntu.com/... )
Martin Thoma
2
@pavon pdfgrepsekarang memiliki opsi rekursi, termasuk -Rjuga mengikuti symlink
Tobias Kienzler
30

Recoll adalah aplikasi pencarian GUI teks lengkap yang fantastis untuk Unix / Linux yang mendukung puluhan format berbeda, termasuk PDF. Ia bahkan dapat mengirimkan nomor halaman dan istilah pencarian yang tepat dari query ke penampil dokumen dan dengan demikian memungkinkan Anda untuk melompat ke hasil langsung dari GUI-nya.

Recoll juga dilengkapi dengan antarmuka baris perintah yang layak dan antarmuka browser web .

Glutanimate
sumber
1
@Glutanimate Akan sangat membantu (saya dan mungkin orang lain juga) jika Anda dapat menambahkan contoh yang berkaitan dengan pertanyaan asli (alat baris perintah untuk mencari beberapa pdf): Saya juga ingin melihat cara melakukan pencarian wildcard dan cara mencari yang direktori saat ini termasuk semua subdirektori . Bagaimana itu terlihat dengan recoll / xapiandi baris perintah (non-GUI)? Terima kasih!
gila tentang rapi
@ LeszekŻarna Mungkin Anda dapat memposting contoh yang Anda uji?
gila tentang rapi
The recoll manual user mungkin berisi beberapa petunjuk, tapi menawarkan agak teknis dan "off-topik" membaca ...
gila tentang rapi
1
@ nutty: recoll -t -q dir: pwdext: pdf 'neuro *' - stackoverflow memakan backticks di sekitar pwd.
medoc
13

Versi pdfgrep (1.3.0) saya yang sebenarnya memungkinkan hal-hal berikut:

pdfgrep -HiR 'pattern' /path

Ketika melakukan pdfgrep --help:

  • H: Cetak nama file untuk setiap kecocokan.
  • i: Abaikan perbedaan kasus.
  • R: Cari direktori secara rekursif.

Ini bekerja dengan baik di Ubuntu saya.

arkhi
sumber
7

Saya membuat skrip kecil yang merusak ini . Bersenang-senanglah dengan itu.

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
}
phil
sumber
2
+1. Tapi bukannya $filename.Anda harus menyalurkannya ke grep.
Raphael Ahrens
3

Saya suka jawaban @ sjr namun saya lebih suka xargs vs -exec. Saya menemukan xargs lebih fleksibel. Sebagai contoh dengan -P kita dapat memanfaatkan banyak CPU ketika masuk akal untuk melakukannya.

find . -name '*.pdf' | xargs -P 5 -I % pdftotext % - | grep --with-filename --label="{}" --color "pattern"
Deian
sumber
poin menarik tentang xargskemampuan pemrosesan paralel. Perhatikan bahwa --labelargumen-opsi Anda akan secara harfiah {} , karena grepperintah sekarang tidak lagi dieksekusi dalam konteks find's exec.
mklement0
2

Saya memiliki masalah yang sama dan karenanya saya menulis sebuah skrip yang mencari semua file pdf dalam folder yang ditentukan untuk sebuah string dan mencetak file PDF yang cocok dengan string kueri.

Mungkin ini akan membantu Anda.

Anda dapat mengunduhnya di sini

Paul Weibert
sumber
mungkin bermanfaat untuk menempatkan skrip di komentar?
baxx
saya mencoba skrip Anda dan ternyata jauh lebih lambat daripada pdfgrepsolusi atau sjr's one-liner, dan itu meninggalkan saya dengan proses yang sedang berlangsung menggunakan 100% dari thread CPU bahkan setelah saya Ctrl-C untuk menghentikannya.
Jason
2

Jika Anda ingin melihat nama file dengan pdftotext, gunakan perintah berikut:

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

Ada utilitas lain yang disebut ripgrep-all , yang didasarkan pada ripgrep .

Ia dapat menangani lebih dari sekadar dokumen PDF, seperti dokumen dan film Office, dan penulis mengklaim lebih cepat dari itu pdfgrep.

Perintah sintaks untuk mencari direktori saat ini secara rekursif, dan yang kedua hanya terbatas pada file PDF:

rga 'pattern' .
rga --type pdf 'pattern' .
oschoudhury
sumber
1

Ada sumber terbuka grep alat sumber daya umum grgrep yang mencari dalam file PDF tetapi juga sumber daya lain seperti konten yang bersarang di arsip, tabel database, meta-data gambar, dependensi file POM dan sumber daya web - dan kombinasi dari ini termasuk pencarian rekursif.

Deskripsi lengkap di bawah tab File cukup banyak mencakup apa yang didukung alat ini.

Saya mengembangkan crgrep sebagai alat opensource.

Craig
sumber
Craig - apakah Anda memiliki koneksi ke proyek itu? Jika demikian, Anda harus menyatakannya dalam jawaban Anda. Saya mengatakan ini karena Anda baru saja memposting jawaban yang hampir identik untuk dua pertanyaan lama lainnya ...
Stephen C
Posting terbaru untuk memperjelas bahwa saya penulis crgrep
Craig
1

Konversi dulu semua file pdf Anda ke file teks:

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

Kemudian gunakan grepseperti biasa. Ini sangat baik karena cepat ketika Anda memiliki banyak pertanyaan dan banyak file PDF.

Martin Thoma
sumber
Ini, ketika dilakukan dalam kombinasi dengan ag github.com/ggreer/the_silver_searcher . Mampu mengurai di psychedeliks Gb dengan mikrodetik. File flat seumur hidup
NVRM
0

Anda memerlukan beberapa alat seperti pdf2text untuk mengkonversi pdf Anda menjadi file teks dan kemudian mencari di dalam teks. (Anda mungkin akan kehilangan beberapa informasi atau simbol).

Jika Anda menggunakan bahasa pemrograman, mungkin ada perpustakaan pdf yang ditulis untuk tujuan ini. misalnya http://search.cpan.org/dist/CAM-PDF/ untuk Perl

Senyum Nylon
sumber
0

coba gunakan 'acroread' dalam skrip sederhana seperti di atas

acathur
sumber