Apakah ada cara untuk mencari file pdf menggunakan kekuatan grep, tanpa mengkonversi ke teks terlebih dahulu di Ubuntu?
Apakah ada cara untuk mencari file pdf menggunakan kekuatan grep, tanpa mengkonversi ke teks terlebih dahulu di Ubuntu?
Jawaban:
Instal paket pdfgrep
, lalu gunakan perintah:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
——————
Cara paling sederhana adalah
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
juga memiliki bendera rekursif. Jadi jawaban ini mungkin dapat dikurangi menjadi: pdfgrep -R pattern /path/
. Meskipun mungkin kurang efektif jika melewati setiap file bahkan jika itu bukan PDF. Dan saya perhatikan ada masalah dengan karakter internasional seperti å, ä dan ö.
-n
opsi ini adalah pro untuk pdfgrep karena memungkinkan untuk memasukkan nomor halaman dalam output (mungkin membantu untuk diproses lebih lanjut).
pattern
? Apa {}
? Ada apa dengan `+`? Saya tidak tahu setelah membaca pertama ... jadi saya pergi ke halaman manual, saya kira.
Jika Anda telah poppler-utils
menginstal (default pada Desktop Ubuntu), Anda dapat "mengubahnya" dengan cepat dan mengirimkannya ke grep
:
pdftotext my.pdf - | grep 'pattern'
Ini tidak akan membuat file .txt.
pdftotext
adalah nama file yang harus ditulis. Namun, berdasarkan konvensi, alat biasanya memungkinkan Anda untuk menulis stdout
alih-alih ke file dengan menentukan -
sebaliknya. Demikian pula, beberapa alat akan menulis stdout
secara default jika Anda menghilangkan argumen seperti itu sepenuhnya (tapi ini tidak selalu mungkin tanpa menciptakan ambiguitas).
pdfgrep ditulis untuk tujuan ini dan tersedia di Ubuntu.
Sebagian besar mencoba untuk kompatibel grep
dan dengan demikian memberikan "kekuatan grep", hanya khusus untuk PDF. Itu termasuk opsi grep umum, seperti --recursive
, --ignore-case
atau --color
.
Berbeda dengan pdftotext | grep
, pdfgrep dapat menampilkan jumlah halaman yang cocok dengan performa yang baik dan umumnya lebih cepat ketika tidak harus mencari seluruh dokumen (misalnya --max-count
atau --quiet
).
Penggunaan dasar adalah:
pdfgrep PATTERN FILE..
di mana PATTERN
string pencarian Anda dan FILE
daftar nama file (atau wildcard di shell).
Lihat halaman manual untuk info lebih lanjut.
Tidak.
Pdf terdiri dari potongan-potongan data, beberapa di antaranya teks, beberapa di antaranya gambar dan beberapa di antaranya benar-benar ajaib XYZ (mis. File .u3d). Potongan-potongan itu sebagian besar terkompresi (mis. Flat, periksa http://www.verypdf.com/pdfinfoeditor/compression.htm ). Untuk 'grep' .pdf Anda harus membalikkan kompresi alias mengekstrak teks.
Anda dapat melakukannya per file dengan alat seperti pdf2text
dan ambil hasilnya, atau Anda menjalankan 'pengindeks' (lihat xapian.org atau lucene ) yang membangun indeks yang dapat dicari dari file .pdf Anda dan kemudian Anda dapat menggunakan pencarian alat mesin pengindeks itu untuk mendapatkan konten pdf
Tapi tidak, Anda tidak bisa grep
file pdf dan berharap jawaban yang dapat diandalkan tanpa mengekstraksi teks terlebih dahulu.
pdfgrep
ada (lihat di atas), sebuah flat "tidak" tidak benar.
Recoll dapat mencari PDF. Ini tidak mendukung ekspresi reguler, tetapi memiliki banyak opsi pencarian lain, jadi mungkin sesuai dengan kebutuhan Anda.
Anda dapat menyalurkan melalui strings
:
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, Anda tidak perlucat
strings
atau grep
.
Lihatlah crgrep alat sumber daya umum yang mendukung pencarian dalam file PDF.
Hal ini juga memungkinkan pencarian 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.
coba ini
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
untuk mencetak garis, polanya muncul di dalam pdf
cd ke folder Anda yang berisi file pdf Anda dan kemudian ..
pdfgrep 'pattern' your.pdf
atau jika Anda ingin mencari lebih dari satu file pdf (mis. di semua file pdf di folder Anda)
pdfgrep 'pattern' `ls *.pdf`
atau
pdfgrep 'pattern' $(ls *.pdf)
ls
output sebagai input ke perintah lain . Cukup pdfgrep 'pattern' *.pdf
sudah
Ada pertanyaan duplikat di StackOverflow. Orang-orang di sana menyarankan variasi jawaban harish.venkarts:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
Keuntungan dari jawaban serupa di sini adalah --with-filename
bendera untuk grep. Ini agak lebih unggul daripada pdfgrep juga, karena grep standar memiliki lebih banyak fitur.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Berikut ini adalah skrip cepat untuk mencari pdf di direktori saat ini:
#!/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 \;
Saya berasumsi maksud Anda tp tidak mengubahnya pada disk, Anda dapat mengubahnya stdout
dan kemudian menerimanya dengan pdftotext
. Memegang pdf tanpa konversi apa pun bukanlah pendekatan praktis karena PDF
sebagian besar merupakan format biner.
Dalam direktori:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
atau dalam direktori dan subdirektori-nya:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Juga karena beberapa pdf
scan, mereka perlu OCR terlebih dahulu. Saya menulis cara yang cukup sederhana untuk mencari semua pdf yang tidak dapat grep
diedit dan OCR mereka.
Saya perhatikan jika pdf
file tidak memiliki font apa pun biasanya tidak dapat dicari. Jadi mengetahui ini bisa kita gunakan pdffonts
.
2 baris pertama pdffonts
adalah header tabel, jadi ketika sebuah file dapat dicari memiliki lebih dari dua output baris, dengan mengetahui hal ini kita dapat membuat:
gedit check_pdf_searchable.sh
lalu tempel ini
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
kemudian membuatnya bisa dieksekusi
chmod +x check_pdf_searchable.sh
kemudian daftarkan semua pdf yang tidak dapat dicari di direktori:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
atau dalam direktori dan subdirektori-nya:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Jika Anda hanya ingin mencari nama / properti pdf ... atau string sederhana yang tidak dikompresi atau disandikan maka alih-alih strings
Anda dapat menggunakan di bawah ini
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
Dari 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
dan cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB