ฉันใช้ 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แต่ก็เห็นได้ชัดว่าจะไม่ได้รับการยอมรับจาก
แน่นอนปรับตามความต้องการของคุณ