ฉันใช้ Opensuse 10.3 และต้องการทราบเครื่องมือบรรทัดคำสั่งเพื่อค้นหาวลีในไฟล์ PDF จำนวนมากภายในไดเรกทอรี ใน Windows XP การค้นหา Explorer อนุญาตสิ่งนี้ แต่ช้าเกินไป มี grep เคล็ดลับที่นี่หรือไม่
ฉันใช้ Opensuse 10.3 และต้องการทราบเครื่องมือบรรทัดคำสั่งเพื่อค้นหาวลีในไฟล์ PDF จำนวนมากภายในไดเรกทอรี ใน Windows XP การค้นหา Explorer อนุญาตสิ่งนี้ แต่ช้าเกินไป มี grep เคล็ดลับที่นี่หรือไม่
คำตอบ:
SEARCH_DIR = "/ บาง / dir / ที่ / คุณ / ต้องการ / เพื่อ / ค้นหา /"; SEARCH_STRING = "สิ่งที่คุณมีการค้นหา";
# การแยกข้อความจาก pdf pdftotext "file.pdf" "file.txt" # กำลังเชื่อมต่อกับ grep pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - "$ SEARCH_STRING" # ถ้าคุณต้องการให้ grep แสดงเฉพาะรายการไฟล์ของไฟล์ pdf ที่ตรงกันให้เพิ่ม --files-with-match pdftotext "file.pdf" / dev / stdout | grep -H --label = "file.pdf" - ไฟล์ที่มีการจับคู่ - "$ SEARCH_STRING" # ค้นหารายการที่เป็นไปได้ของ pdf ที่ต้องการค้นหา ค้นหา "$ SEARCH_DIR" -type f -name '* .pdf'> list-of-pdf.txt
# ทุกอย่างเข้าร่วมโดย awk เป็นเทปพันท่อส่งไปยัง bash เพื่อการประมวลผล # เครื่องหมายคำพูดคู่หนีเป็น x22 ภายใน awk ค้นหา "$ SEARCH_DIR" -type f -name '* .pdf' | awk -v SEARCH_STRING = "$ SEARCH_STRING" '{ พิมพ์ "pdftotext \ x22" $ 0 "\ x22 / dev / stdout | grep -H --label = \ x22" $ 0 "\ x22 - \ x22" SEARCH_STRING "\ x22" } '| ทุบตี
# โดยไม่ต้องทุบตี กระบวนการเพิ่มเติมเพื่อให้ตรงกับความต้องการของคุณ ค้นหา "$ SEARCH_DIR" - พิมพ์ 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"; ในขณะที่ (EXEC | getline ret) { พิมพ์ "สำหรับไฟล์ [" $ 0 "] เรามีการจับคู่ [" ret "]"; # ทำอะไรก็ได้ที่คุณชอบ }; ปิด (EXEC); }'
ภายใต้ทั้ง Linux และ Windows คุณสามารถใช้ Acrobat Reader ซึ่งมีคำสั่งเพื่อค้นหาหลายไฟล์
ภายใต้ Linux จะมี Recoll ซึ่งจะสร้างดัชนีของไฟล์ pdf ของคุณ (และอื่น ๆ ) ในครั้งแรกที่คุณเรียกใช้ หลังจากสร้างดัชนีแล้วการค้นหาคำควรเร็วมาก การค้นหาวลีควรจะสมเหตุสมผล ตรวจสอบให้แน่ใจว่าpdftotext
คำสั่งนั้นได้รับการติดตั้งก่อนที่คุณจะเริ่ม Recoll ภายใต้ Debian และ Ubuntu มันอยู่ในpoppler-utils
แพ็คเกจฉันไม่รู้เกี่ยวกับ Suse
หรือคุณสามารถแปลงไฟล์เป็นข้อความโดยตรงและใช้ grep ในไฟล์ข้อความด้วยคำสั่งด้านล่าง
find -name '* .pdf' -exec pdftotext {} \; grep -r --include '* .txt' -l -F "วลีที่ต้องการค้นหา" grep -r - รวม '* .txt' -l -E "นิพจน์ทั่วไปเพื่อค้นหา"
pdftotext
(ซึ่งเครื่องมือเช่น Recoll จะทำโดยอัตโนมัติ)
Adobe Reader X ไม่ทำงานและจะไม่อนุญาตให้มีการค้นหาภายใต้ไดเรกทอรีทั้งหมดและไดเรกทอรีไม่เพียง แต่ในไฟล์ แต่มันไม่ได้เป็นโปรแกรมบรรทัดคำสั่ง
recoll
ติดตั้งบนเดเบียนอย่างคล่องแคล่วตอนนี้พยายามทำให้มันใช้งานได้สำหรับพนักงานที่ทำงานบน windows ของฉัน
หากต้องการแสดงรายการไฟล์ทั้งหมดซ้ำในไดเรกทอรีหลักของคุณที่มีนามสกุลไฟล์ PDF และมีบรรทัดที่ตรงกับตัวอย่าง regex ' [iI]n Haskell
' คุณสามารถออก:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir sh -c 'pdftotext "$0" - | grep -El --label="$PWD${0#?}" "$1"' {} '[iI]n Haskell' \;
หมายเหตุ:
-exec
หรือxargs
เพราะเหตุผลด้านความปลอดภัยฉันคิดว่ามันเป็นวิธีปฏิบัติที่ดีในการทำเช่นนี้ การเปลี่ยน ' -execdir
' เป็น ' -exec
' และ ' $PWD${0#?}
' เป็น ' $0
' ควรจะได้ผลลัพธ์เดียวกันในกรณีนี้./
') ในตัวอย่างนี้พา ธ ที่จับคู่นั้นเป็นค่าสัมบูรณ์ทั้งหมด (เช่นเริ่มต้นด้วย ' /
') เนื่องจาก ' ~/
' ถูกขยายเป็นพา ธ สัมบูรณ์ของโฮมไดเรกทอรีของผู้ใช้ปัจจุบันและเป็นอาร์กิวเมนต์ของพา ธ เท่านั้น$0
' และ ' $1
' เป็นพารามิเตอร์ตำแหน่งที่ใช้ในการอ้างอิงอาร์กิวเมนต์อย่างถูกต้อง หากสิ่งนี้ทำไม่ถูกต้องคำสั่งจะมีความเสี่ยงต่อชื่อไฟล์โดยพลการ${0#?}
' ตัดอักขระตัวแรกของ$0
เช่น ' .
'หากต้องการพิมพ์แต่ละบรรทัดที่จับคู่ดำเนินการโดยชื่อไฟล์:
find ~/ -regextype posix-extended -regex '.*\.pdf' -execdir bash -c 'pdftotext "$0" - | grep -EH --label="${0:2}" "$1"' {} '[iI]n Haskell' \;
ตัวแปรนี้ใช้ ' -H
' แทน ' -l
' และป้ายกำกับด้วยชื่อไฟล์แทนที่จะเป็นไฟล์พา ธ ' ${0:2}
' แถบตัวละครสองตัวแรกของ$0
คือ ' ./
' sh
แต่ก็เห็นได้ชัดว่าจะไม่ได้รับการยอมรับจาก
แน่นอนปรับตามความต้องการของคุณ