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 đ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?
Câu trả lời:
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); } '
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 pdftotext
lệnh được cài đặt trước khi bạn bắt đầu Recoll; trong Debian và Ubuntu, nó nằm trong poppler-utils
gó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"
pdftotext
(công cụ như Recoll sẽ tự động thực hiện).
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.
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.
Để 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 Haskell
thứ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:
-exec
hoặc xargs
bở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../
'). 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.