Alat baris perintah untuk mencari frasa dalam sejumlah besar file pdf

9

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?

tukang es
sumber
wingrep.com ! :)
Apache
Saya ingin tahu alat baris perintah terlebih dahulu dan jika ada alat GUI, maka itu akan menyenangkan juga. Windows hanya di bawah Windows. Dan saya hanya ingin mencari file pdf, jadi aplikasi yang dioptimalkan untuk itu akan menyenangkan
iceman
1
Pertanyaan serupa di Unix Stack Exchange
Gilles 'SO- stop being evil'

Jawaban:

6
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);
} '
pengguna42723
sumber
Saya kira Anda tidak melihat bagian dari pertanyaan yang menyebutkan "Windows XP" atau tag pencarian windows . Saya tahu pertanyaan (bingung) dimulai dengan "openSUSE" , tetapi ada lebih banyak referensi Windows daripada referensi Linux; terutama ketika Anda menghitung komentar selanjutnya juga.
Synetech
@Synetech: Dia menolak jawaban dengan "Wingrep hanya di bawah Windows", yang menunjukkan dia menginginkan solusi Linux.
Siput mekanik
@Mechanicalsnail, ia menolaknya karena itu adalah alat GUI di mana telah meminta alat baris perintah.
Synetech
3

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 pdftotextperintah diinstal sebelum Anda memulai Recoll; di bawah Debian dan Ubuntu, ada dalam poppler-utilspaket, 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"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
adobe tidak akan mengizinkan untuk mencari di bawah seluruh direktori, itu akan melakukannya hanya di dalam file. Saya ingin tahu alat-alat baris perintah terlebih dahulu dan jika ada alat-alat GUI, maka itu akan menyenangkan juga
iceman
Adobe Reader 9 di Linux memiliki entri menu "Edit | Search" yang memungkinkan Anda untuk mencari di semua file PDF dalam direktori. Pada baris perintah, semua metode yang saya ketahui melibatkan langkah pdftotext(alat yang seperti Recoll akan lakukan secara otomatis).
Gilles 'SO- berhenti bersikap jahat'
1
+1 untuk Recoll. Mengindeks file akan menghemat waktu jika Anda memiliki banyak dan Anda sering mencari.
Siput mekanik
1

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.

stendabrog
sumber
Apakah itu dalam versi terbaru Acrobat X? rilis yang mana?
iceman
Saya mencoba alat pengindeksan Acrobat dan menyebutnya primitif adalah pujian. recolldiinstal pada debian dengan mudah, sekarang mencoba membuatnya dapat digunakan untuk karyawan berbasis windows saya.
Chris K
0

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:

  • Meskipun ini tidak terlalu diperlukan untuk contoh ini, saya telah membangun ini menghindari penggunaan -execatau xargskarena, 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.
  • Alih-alih menggunakan gumpalan untuk mencocokkan pola dengan nama file, akan berguna untuk menggunakan kekuatan ekspresif yang lebih besar dari ekspresi reguler dan untuk kecocokan pola pada seluruh jalur. Saya memasukkan latihan di sini untuk menunjukkan bagaimana hal itu dapat dilakukan. Perhatikan bahwa jalur yang cocok dengan pola adalah jalur yang biasanya dicetak. Apakah itu relatif atau absolut tergantung pada argumen jalur yang diberikan, yang jika dipancarkan secara default ke direktori kerja saat 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.
  • The ' $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.

James Haigh
sumber