Có cách nào để tìm kiếm tệp pdf bằng sức mạnh của grep mà không cần chuyển đổi thành văn bản đầu tiên trong Ubuntu không?
Có cách nào để tìm kiếm tệp pdf bằng sức mạnh của grep mà không cần chuyển đổi thành văn bản đầu tiên trong Ubuntu không?
Câu trả lời:
Cài đặt gói pdfgrep
, sau đó sử dụng lệnh:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
Tinh ranh
Cách đơn giản nhất là
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
cũng có một cờ đệ quy. Vì vậy, câu trả lời này có lẽ có thể được giảm xuống : pdfgrep -R pattern /path/
. Mặc dù nó có thể kém hiệu quả hơn nếu nó đi qua mọi tệp ngay cả khi nó không phải là PDF. Và tôi nhận thấy rằng nó có vấn đề với các nhân vật quốc tế như å, ä và ö.
-n
tùy chọn là một pro cho pdfgrep vì nó cho phép bao gồm số trang trong đầu ra (có thể hữu ích để xử lý thêm).
pattern
? Có gì {}
? Có chuyện gì với `+`? Tôi không có ý tưởng gì khi lần đầu tiên đọc ... vì vậy tôi cho rằng trang này tôi đi.
Nếu bạn đã poppler-utils
cài đặt (mặc định trên Ubuntu Desktop), bạn có thể "chuyển đổi" nó ngay lập tức và chuyển nó thành grep
:
pdftotext my.pdf - | grep 'pattern'
Điều này sẽ không tạo ra một tập tin .txt.
pdftotext
là tên tệp cần ghi. Tuy nhiên, theo quy ước, các công cụ thường cho phép bạn ghi vào stdout
thay vì vào tệp bằng cách chỉ định -
thay thế. Tương tự, một số công cụ sẽ ghi vào stdout
mặc định nếu bạn bỏ hoàn toàn một đối số như vậy (nhưng điều này không phải lúc nào cũng có thể mà không tạo ra sự mơ hồ).
pdfgrep được viết cho chính xác mục đích này và có sẵn trong Ubuntu.
Nó cố gắng tương thích hầu hết grep
và do đó cung cấp "sức mạnh của grep", chỉ chuyên dùng cho các tệp PDF. Điều đó bao gồm các tùy chọn grep phổ biến, chẳng hạn như --recursive
, --ignore-case
hoặc --color
.
Ngược lại pdftotext | grep
, pdfgrep có thể xuất số trang của trận đấu theo cách thức biểu diễn và thường nhanh hơn khi không phải tìm kiếm toàn bộ tài liệu (ví dụ: --max-count
hoặc --quiet
).
Cách sử dụng cơ bản là:
pdfgrep PATTERN FILE..
PATTERN
chuỗi tìm kiếm của bạn ở đâu và FILE
danh sách tên tệp (hoặc ký tự đại diện trong vỏ).
Xem trang hướng dẫn để biết thêm thông tin.
Không.
Một pdf bao gồm các khối dữ liệu, một số trong đó là văn bản, một số trong số chúng là hình ảnh và một số trong số chúng thực sự kỳ diệu XYZ (ví dụ: tệp .u3d). Các khối đó hầu hết được nén (ví dụ: phẳng, kiểm tra http://www.verypdf.com/pdfinfoeditor/compression.htmlm ). Để 'grep' một .pdf, bạn phải đảo ngược việc nén hay trích xuất văn bản.
Bạn có thể làm điều đó một trong hai mỗi tập tin với các công cụ như pdf2text
và grep kết quả, hoặc bạn chạy một 'indexer' (nhìn vào xapian.org hoặc Lucene ) trong đó xây dựng một chỉ số thể tìm kiếm ra các file .pdf của bạn và sau đó bạn có thể sử dụng tìm kiếm công cụ công cụ của bộ chỉ mục đó để có được nội dung của pdf.
Nhưng không, bạn không thể grep
tập tin pdf và hy vọng có câu trả lời đáng tin cậy mà không cần trích xuất văn bản trước.
pdfgrep
tồn tại (xem ở trên), một chữ "không" phẳng là không chính xác.
Recoll có thể tìm kiếm các tệp PDF. Nó không hỗ trợ các biểu thức thông thường, nhưng nó có nhiều tùy chọn tìm kiếm khác, vì vậy nó có thể phù hợp với nhu cầu của bạn.
Bạn có thể dẫn nó qua strings
đầu tiên: -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, bạn không cầncat
strings
hay grep
.
Hãy xem crgrep công cụ tài nguyên chung crgrep hỗ trợ tìm kiếm trong các tệp PDF.
Nó cũng cho phép tìm kiếm các tài nguyên khác như nội dung được lồng trong kho 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à kết hợp các tài nguyên này bao gồm tìm kiếm đệ quy.
thử đi
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
để in các dòng mô hình xảy ra bên trong pdf
cd vào thư mục của bạn chứa tệp pdf của bạn và sau đó ..
pdfgrep 'pattern' your.pdf
hoặc nếu bạn muốn tìm kiếm nhiều hơn một tệp pdf (ví dụ: trong tất cả các tệp pdf trong thư mục của bạn)
pdfgrep 'pattern' `ls *.pdf`
hoặc là
pdfgrep 'pattern' $(ls *.pdf)
ls
đầu ra làm đầu vào cho các lệnh khác . Chỉ cần pdfgrep 'pattern' *.pdf
là đủ
Có một câu hỏi trùng lặp trên StackOverflow. Những người ở đó đề xuất một biến thể của câu trả lời harish.venkarts:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
Lợi thế so với câu trả lời tương tự ở đây là --with-filename
cờ cho grep. Điều này cũng có phần vượt trội so với pdfgrep, vì grep tiêu chuẩn có nhiều tính năng hơn.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-mult Môn-pdf-files
Đây là một kịch bản nhanh để tìm kiếm pdf trong thư mục hiện tại:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "usage $0 VALUE" 1>&2
exit 1
fi
echo 'SEARCH IS CASE SENSITIVE' 1>&2
find . -name '*.pdf' -exec /bin/bash -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"' $1 \;
Tôi giả sử bạn có nghĩa là tp không chuyển đổi nó trên đĩa, bạn có thể chuyển đổi chúng stdout
và sau đó grep nó với pdftotext
. Cắt xén pdf mà không có bất kỳ loại chuyển đổi nào không phải là một cách tiếp cận thực tế vì PDF
chủ yếu là định dạng nhị phân.
Trong thư mục:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
hoặc trong thư mục và các thư mục con của nó:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Ngoài ra bởi vì một số pdf
quét là cần phải được OCRed trước. Tôi đã viết một cách khá đơn giản để tìm kiếm tất cả các pdf không thể chỉnh sửa grep
và OCR chúng.
Tôi nhận thấy nếu một pdf
tập tin không có bất kỳ phông chữ nào thì nó thường không thể tìm kiếm được. Vì vậy, biết điều này chúng ta có thể sử dụng pdffonts
.
2 dòng đầu tiên pdffonts
là tiêu đề bảng, vì vậy khi một tệp có thể tìm kiếm được có nhiều hơn hai dòng đầu ra, biết điều này chúng ta có thể tạo:
gedit check_pdf_searchable.sh
sau đó dán cái này
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
sau đó làm cho nó thực thi
chmod +x check_pdf_searchable.sh
sau đó liệt kê tất cả các pdf không thể tìm kiếm trong thư mục:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
hoặc trong thư mục và các thư mục con của nó:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Nếu bạn chỉ muốn tìm kiếm tên / thuộc tính pdf ... hoặc các chuỗi đơn giản không được nén hoặc mã hóa thì thay vào đó strings
bạn có thể sử dụng tên dưới đây
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
Từ grep --help
:
--binary-files=TYPE assume that binary files are TYPE;
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
và cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB