2011-01-10 53 views
174

Làm cách nào để tìm kiếm nội dung của tệp PDF trong thư mục/thư mục con? Tôi đang tìm một số công cụ dòng lệnh. Có vẻ như grep không thể tìm kiếm tệp PDF.Cách tìm kiếm nội dung của nhiều tệp pdf?

+4

Grep sẽ không hoạt động dưới dạng PDF là định dạng nhị phân và văn bản thường được nén hoặc được mã hóa theo nhiều cách khác nhau. –

+2

Đây là giải pháp GUI: Adobe Reader, xem https://wikispaces.psu.edu/display/training/Search+for+Text+in+Multiple+PDFs+with+Adobe+Reader –

+2

Related: http: // unix .stackexchange.com/questions/6704/grep-pdf-files – Flow

Trả lời

157

phân phối của bạn nên cung cấp một tiện ích gọi là pdftotext:

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

Các "-" là cần thiết để có đầu ra pdftotext để stdout, chưa tập tin. Các tùy chọn --with-filename--label= sẽ đặt tên tệp vào đầu ra của grep. Cờ tùy chọn --color rất đẹp và cho grep biết đầu ra bằng các màu trên thiết bị đầu cuối.

(Trong Ubuntu, pdftotext được cung cấp bởi các gói xpdf-utils hoặc poppler-utils.)

Phương pháp này sử dụng pdftotextgrep, có lợi thế hơn pdfgrep nếu bạn muốn sử dụng tính năng của GNU grep rằng pdfgrep không ủng hộ. Lưu ý: pdfgrep-1.3.x hỗ trợ tùy chọn -C để in dòng ngữ cảnh.

+3

Tác phẩm này hoạt động nhưng không hiển thị tên tệp phù hợp. Bất kỳ ý tưởng? –

+1

@Kurt Pfeifle Chỉnh sửa "(Chỉnh sửa bởi -kp-)" bạn đã thực hiện không hoạt động vì 'grep' lọc các tên tệp đã in. –

+0

@sjr no, trong khi giải pháp 'pdfgrep' là tốt cho các tìm kiếm thực sự nhanh chóng và đơn giản, thường tôi muốn nhận được một số ngữ cảnh, vì một dòng đơn sẽ không đủ hữu ích - vì vậy khi tôi thêm vào câu trả lời này: Ví dụ , bạn có thể thêm tùy chọn -C5 trước "mẫu của bạn" để bao gồm 5 dòng ngữ cảnh cho đầu ra - pdfgrep không hỗ trợ điều này –

0

Bạn cần một số công cụ như pdf2text để chuyển đổi pdf đầu tiên thành tệp văn bản và sau đó tìm kiếm bên trong văn bản. (Bạn có thể sẽ bỏ lỡ một số thông tin hoặc biểu tượng).

Nếu bạn đang sử dụng ngôn ngữ lập trình, có thể có các thư viện pdf được viết cho mục đích này. ví dụ. http://search.cpan.org/dist/CAM-PDF/ cho Perl

-1

hãy thử sử dụng 'acroread' trong một kịch bản đơn giản như trên

164

pdfgrep, mà thực hiện chính xác những gì tên của nó cho thấy.

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

Tôi đã sử dụng nó cho các tìm kiếm đơn giản và nó hoạt động tốt.

(Có gói trong Debian, Ubuntu và Fedora.)

Kể từ phiên bản 1.3.0 pdfgrep hỗ trợ tìm kiếm đệ quy. Phiên bản này có sẵn trong Ubuntu kể từ Ubuntu 12.10 (Quantal).

+1

Từ Natty (Ubuntu 11.04) trở lên (Xem http://packages.ubuntu.com/search? keywords = pdfgrep & searchon = tên & suite = all & section = all) –

+1

@pavon 'pdfgrep' hiện có tùy chọn đệ quy, bao gồm' -R' để theo dõi các liên kết tượng trưng –

7

Tôi đã thực hiện phá hủy tập lệnh nhỏ này. Hãy vui vẻ với nó.

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. Nhưng thay vì '$ filename.' bạn nên đặt nó vào' grep'. –

2

Tôi đã gặp vấn đề tương tự và do đó tôi đã viết một tập lệnh tìm kiếm tất cả tệp pdf trong thư mục được chỉ định cho chuỗi và in các tệp PDF khớp với chuỗi truy vấn.

Có thể điều này sẽ hữu ích cho bạn.

Bạn có thể tải nó here

+0

có thể hữu ích khi đặt tập lệnh trong nhận xét? – baxx

2

Nếu bạn muốn xem tên tập tin với pdftotext sử dụng lệnh sau:

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

Điều này cũng hiển thị tên tệp không có mẫu nhưng nó rất hữu ích .. – Raghav

20

Recoll là toàn văn GUI ứng dụng tìm kiếm tuyệt vời cho Unix/Linux hỗ trợ hàng chục định dạng khác nhau, bao gồm PDF. Nó thậm chí có thể chuyển số trang chính xác và cụm từ tìm kiếm của một truy vấn đến trình xem tài liệu và do đó cho phép bạn chuyển đến kết quả ngay từ GUI của nó.

Thu hồi cũng đi kèm với giao diện dòng lệnh khả thi và web-browser interface.

+0

Đã kiểm tra, hoạt động tốt. Cảm ơn –

+1

@Glutanimate Nó sẽ giúp (tôi và có thể cả những người khác nữa) nếu bạn có thể thêm một ** ví dụ ** liên quan đến câu hỏi gốc * (công cụ dòng lệnh để tìm kiếm nhiều pdf): * Tôi cũng muốn xem cách thực hiện tìm kiếm ** ký tự đại diện ** và cách tìm kiếm thư mục hiện tại ** bao gồm tất cả các thư mục con **. Làm thế nào mà sẽ nhìn với 'recoll/xapian' trong dòng lệnh (non-GUI)? Cảm ơn! –

+0

@ LeszekŻarna Có lẽ bạn có thể đăng ví dụ bạn đã kiểm tra? –

1

Có một công cụ grep tài nguyên chung nguồn mở crgrep tìm kiếm trong tệp PDF mà còn các tài nguyên khác như nội dung được lồng trong lưu trữ, bảng cơ sở dữ liệu, siêu dữ liệu hình ảnh, phụ thuộc tệp POM và tài nguyên web - và các kết hợp này bao gồm đệ quy Tìm kiếm.

Mô tả đầy đủ trong tab Tệp chứa khá nhiều công cụ hỗ trợ.

Tôi đã phát triển crgrep như một công cụ mã nguồn mở.

+0

Craig - bạn có kết nối với dự án đó không? Nếu vậy, bạn nên nêu rõ trong câu trả lời của bạn. Tôi nói điều này bởi vì bạn vừa đăng một câu trả lời hầu như giống hệt với hai câu hỏi cũ khác ... –

+0

Cập nhật bài đăng để làm rõ rằng tôi là tác giả của crgrep – Craig

9

phiên bản thực tế của tôi về pdfgrep (1.3.0) cho phép như sau:

pdfgrep -HiR 'pattern' /path 

Khi làm pdfgrep --help:

  • H: In tên tập tin cho mỗi trận đấu.
  • i: Bỏ qua phân biệt chữ hoa chữ thường.
  • R: Tìm kiếm thư mục theo cách đệ quy.

Nó hoạt động tốt trên Ubuntu của tôi.

2

Tôi thích câu trả lời của @ sjr nhưng tôi thích xargs hơn so với -exec. Tôi thấy xargs linh hoạt hơn. Ví dụ với -P, chúng ta có thể tận dụng nhiều CPU khi có ý nghĩa.

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

điểm thú vị về khả năng xử lý song song 'xargs' '. Lưu ý rằng đối số tùy chọn '--label' của bạn sẽ là _literally_' {} ', bởi vì lệnh' grep' bây giờ không còn được thực hiện trong ngữ cảnh '' của 'tìm'. – mklement0

1

Đầu chuyển đổi tất cả các file pdf của bạn để tập tin văn bản:

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

Sau đó sử dụng grep như bình thường. Điều này đặc biệt tốt vì nó nhanh khi bạn có nhiều truy vấn và nhiều tệp PDF.

+0

Điều này, khi được thực hiện kết hợp với 'ag' https://github.com/ggreer/the_silver_searcher. Có khả năng phân tích cú pháp tại psychedeliks Gb tính bằng micro giây. Tệp phẳng cho cuộc sống – Cryptopat

Các vấn đề liên quan