Công cụ dòng lệnh để tìm kiếm cụm từ với số lượng lớn tệp pdf


9

Tôi đang sử dụng Opensuse 10.3 và muốn biết các công cụ dòng lệnh để tìm kiếm các cụm từ với số lượng lớn tệp pdf trong một thư mục. Trong Windows XP, tìm kiếm Explorer cho phép điều này nhưng quá chậm. Có lời khuyên grep ở đây?



Tôi muốn biết các công cụ dòng lệnh trước tiên và nếu có các công cụ GUI, thì nó cũng sẽ rất tuyệt..Wingrep chỉ có trong Windows. Và tôi muốn chỉ tìm kiếm các tệp pdf, vì vậy một ứng dụng được tối ưu hóa cho điều đó sẽ rất tốt để có
iceman

Câu trả lời:


6
SEARCH_DIR = "/ some / dir / where / you / muốn / to / search /";
SEARCH_STRING = "bất cứ điều gì bạn đang tìm kiếm";
# trích xuất văn bản từ pdf
pdftotext "file.pdf" "file.txt"

# kết nối với grep
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING"

# nếu bạn muốn grep chỉ hiển thị danh sách tệp của tệp pdf phù hợp, hãy thêm --files-with-khớp
pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --files-with-Match - "$ SEARCH_STRING"

# tìm danh sách pdf có thể tìm kiếm từ
tìm "$ SEARCH_DIR" -type f -name '* .pdf'> list-of-pdf.txt
# mọi thứ được nối bởi awk dưới dạng băng keo, được gửi đến bash để xử lý
# trích dẫn kép được thoát là x22 bên trong awk.
tìm "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{
in "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22"
} '| bash

# Với bash ra. Quá trình tiếp theo để phù hợp với nhu cầu của bạn
tìm "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '
{
EXEC = "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22";
while (EXEC | getline ret) {
 in "Đối với tệp [" $ 0 "] chúng tôi đã khớp [" ret "]";
 # làm bất cứ việc gì bạn thích. 
};
đóng (EXEC);
} '

Tôi đoán bạn đã không chú ý đến phần câu hỏi đã đề cập đến Windows Windows XP hay thẻ tìm kiếm windows . Tôi biết câu hỏi (một cách bối rối) bắt đầu với, openSUSE , nhưng có nhiều tài liệu tham khảo Windows hơn tài liệu tham khảo Linux; đặc biệt là khi bạn đếm bình luận tiếp theo của anh ấy là tốt.
Synetech

@Synetech: Anh ấy đã từ chối một câu trả lời với "Wingrep chỉ có trong Windows", điều đó cho thấy anh ấy muốn một giải pháp Linux.
Ốc cơ khí

@M Mechanicalsnail, anh đã từ chối vì đây là một công cụ GUI đã yêu cầu một công cụ dòng lệnh.
Synetech

3

Trong cả Linux và Windows, bạn có thể sử dụng Acrobat Reader, có lệnh để tìm kiếm nhiều tệp.

Trong Linux, có Recoll, sẽ xây dựng một chỉ mục các tệp pdf của bạn (và hơn thế nữa) trong lần đầu tiên bạn chạy nó. Sau khi chỉ mục được xây dựng, tìm kiếm từ sẽ rất nhanh; tìm kiếm cụm từ phải hợp lý. Đảm bảo pdftotextlệnh được cài đặt trước khi bạn bắt đầu Recoll; trong Debian và Ubuntu, nó nằm trong poppler-utilsgói, tôi không biết về Suse.

Hoặc bạn có thể trực tiếp chuyển đổi các tệp thành văn bản và sử dụng grep trên các tệp văn bản với các lệnh bên dưới.

tìm -name '* .pdf' -exec pdftotext {} \;
grep -r --incoide '* .txt' -l -F "cụm từ chính xác để tìm kiếm"
grep -r - bao gồm '* .txt' -l -E "biểu thức chính quy để tìm kiếm"

adobe sẽ không cho phép tìm kiếm trong toàn bộ thư mục, nó sẽ làm như vậy chỉ trong một tập tin. Tôi muốn biết các công cụ dòng lệnh trước tiên và nếu có các công cụ GUI, thì nó cũng sẽ rất tuyệt
iceman

Adobe Reader 9 trong Linux có mục trình đơn "Chỉnh sửa | Tìm kiếm" cho phép bạn tìm kiếm trong tất cả các tệp PDF trong một thư mục. Trên dòng lệnh, tất cả các phương thức tôi biết đều liên quan đến một bước pdftotext(công cụ như Recoll sẽ tự động thực hiện).
Gilles 'SO- ngừng trở nên xấu xa'

1
+1 cho Recoll. Lập chỉ mục các tệp sẽ tiết kiệm thời gian nếu bạn có nhiều và bạn tìm kiếm chúng thường xuyên.
Ốc cơ khí

1

Adobe Reader X không được công việc và nó không cho phép tìm kiếm dưới toàn bộ một thư mục và thư mục con, không chỉ bên trong một tập tin, nhưng nó không phải là một chương trình dòng lệnh.


Có phải trong phiên bản mới nhất của Acrobat X? Phát hành nào?
iceman

Tôi đã thử công cụ lập chỉ mục Acrobat và gọi nó là nguyên thủy là một lời khen. recollđược cài đặt trên debian một cách cẩn thận, hiện đang cố gắng làm cho nó có thể sử dụng được cho các nhân viên dựa trên windows của tôi.
Chris K

0

Để liệt kê đệ quy tất cả các tệp trong thư mục chính của bạn có phần mở rộng tệp PDF và có chứa một dòng khớp với biểu [iI]n Haskellthức chính quy, chẳng hạn, bạn có thể phát hành:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;

Nhận xét:

  • Mặc dù ví dụ này không đặc biệt cần thiết, tôi đã xây dựng điều này để tránh việc sử dụng -exechoặc xargsbởi vì, vì lý do bảo mật , tôi nghĩ rằng đó là cách thực hành tốt để tập thói quen làm việc đó. Thay đổi ' -execdir' thành ' -exec' và ' $PWD${0#?}' thành ' $0' sẽ đạt được kết quả tương tự trong trường hợp này.
  • Thay vì sử dụng những đống cho mẫu-phù hợp với tên tập tin, nó có thể hữu ích để sử dụng sức mạnh ý nghĩa lớn hơn của biểu thức thông thường và mô hình trận đấu trên toàn bộ con đường. Tôi bao gồm thực hành ở đây để chỉ ra làm thế nào nó có thể được thực hiện. Lưu ý rằng đường dẫn khớp với mẫu là đường dẫn thường được in. Cho dù nó là tương đối hay tuyệt đối phụ thuộc vào (các) đối số đường dẫn đã cho, nếu được phát mặc định cho thư mục làm việc hiện tại (' ./'). Trong ví dụ này, các đường dẫn khớp với tất cả đều tuyệt đối (nghĩa là bắt đầu bằng ' /') vì ' ~/' được mở rộng thành đường dẫn tuyệt đối của thư mục chính của người dùng hiện tại và đó là đối số đường dẫn duy nhất.
  • ' $0' Và ' $1' là các tham số vị trí được sử dụng theo cách để trích dẫn chính xác các đối số. Nếu điều này không được thực hiện đúng cách, lệnh dễ bị tổn thương với tên tệp tùy ý.
  • ' ${0#?}' tước ký tự đầu tiên của $0, tức là ' .'.

Để in từng dòng phù hợp được tiến hành bởi tên tệp:

find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;

Biến thể này sử dụng ' -H' thay vì ' -l' và nhãn với tên tệp thay vì filepath. ' ${0:2}' tước hai ký tự đầu tiên của $0, tức là ' ./', nhưng dường như không được nhận ra bởi sh.

Tất nhiên, điều chỉnh theo nhu cầu của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.