Saya menggunakan Opensuse 10.3 dan ingin tahu alat baris perintah untuk mencari frasa dalam banyak file pdf di dalam direktori. Di Windows XP, pencarian Explorer memungkinkan ini tetapi terlalu lambat. Apakah ada tips grep di sini?
Saya menggunakan Opensuse 10.3 dan ingin tahu alat baris perintah untuk mencari frasa dalam banyak file pdf di dalam direktori. Di Windows XP, pencarian Explorer memungkinkan ini tetapi terlalu lambat. Apakah ada tips grep di sini?
Jawaban:
SEARCH_DIR = "/ some / dir / where / you / want / to / search /"; SEARCH_STRING = "apa pun yang Anda cari";
# mengekstraksi teks dari pdf pdftotext "file.pdf" "file.txt" # menghubungkan dengan grep pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING" # jika Anda ingin grep hanya menampilkan daftar file file pdf yang cocok, tambahkan --files-with-cocok pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" --files-with-cocok - "$ SEARCH_STRING" # temukan daftar pdf yang memungkinkan untuk dicari temukan "$ SEARCH_DIR" -type f -name '* .pdf'> daftar-of-pdf.txt
# semuanya bergabung dengan awk sebagai lakban, dikirim ke bash untuk diproses # kutipan ganda diloloskan sebagai x22 di dalam awk. temukan "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{ cetak "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22" } '| bash
# Tanpa bash. Proses lebih lanjut untuk memenuhi kebutuhan Anda temukan "$ 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) { cetak "Untuk file [" $ 0 "] kami telah mencocokkan [" ret "]"; lakukan apa saja yang kamu suka. }; tutup (EXEC); } '
Di Linux dan Windows, Anda dapat menggunakan Acrobat Reader, yang memiliki perintah untuk mencari banyak file.
Di Linux, ada Recoll, yang akan membangun indeks file pdf Anda (dan banyak lagi) saat pertama kali Anda menjalankannya. Setelah indeks dibuat, pencarian kata harus sangat cepat; pencarian frase harus masuk akal. Pastikan pdftotext
perintah diinstal sebelum Anda memulai Recoll; di bawah Debian dan Ubuntu, ada dalam poppler-utils
paket, saya tidak tahu tentang Suse.
Atau Anda bisa langsung mengonversi file menjadi teks dan menggunakan grep pada file teks dengan perintah di bawah ini.
temukan -nama '* .pdf' -exec pdftotext {} \; grep -r --sertakan '* .txt' -l -F "frasa yang tepat untuk mencari" grep -r --sertakan '* .txt' -l -E "ekspresi reguler untuk mencari"
pdftotext
(alat yang seperti Recoll akan lakukan secara otomatis).
Adobe Reader X melakukan pekerjaan dan tidak memungkinkan pencarian di bawah seluruh direktori dan subdirektori, tidak hanya di dalam file, tetapi bukan program baris perintah.
recoll
diinstal pada debian dengan mudah, sekarang mencoba membuatnya dapat digunakan untuk karyawan berbasis windows saya.
Untuk secara rekursif mendaftarkan semua file di direktori home Anda yang memiliki ekstensi file PDF dan yang berisi garis yang cocok dengan regex ' [iI]n Haskell
' misalnya, Anda dapat mengeluarkan:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;
Catatan:
-exec
atau xargs
karena, untuk alasan keamanan , saya pikir itu praktik yang baik untuk membiasakan diri melakukannya. Mengubah ' -execdir
' menjadi ' -exec
' dan ' $PWD${0#?}
' menjadi ' $0
' akan mencapai hasil yang sama dalam hal ini../
'). Dalam contoh ini, jalur yang cocok dengan semua mutlak (yaitu dimulai dengan ' /
') karena ' ~/
' diperluas ke jalur absolut dari direktori home pengguna saat ini, dan itu adalah satu-satunya argumen jalur.$0
' dan ' $1
' adalah parameter posisi yang digunakan sedemikian rupa untuk mengutip argumen dengan benar. Jika ini tidak dilakukan dengan benar, perintah rentan terhadap nama file yang sewenang-wenang.${0#?}
' menghapus karakter pertama $0
, yaitu ' .
'.Untuk mencetak setiap baris yang cocok dilanjutkan dengan nama file:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;
Varian ini menggunakan ' -H
' alih-alih ' -l
', dan label dengan nama file daripada nama file. ' ${0:2}
' menghapus dua karakter pertama $0
, yaitu ' ./
', tetapi tampaknya tidak dikenali oleh sh
.
Tentu saja, sesuaikan dengan kebutuhan Anda.