เครื่องมือบรรทัดคำสั่งเพื่อค้นหาวลีในไฟล์ PDF จำนวนมาก


9

ฉันใช้ Opensuse 10.3 และต้องการทราบเครื่องมือบรรทัดคำสั่งเพื่อค้นหาวลีในไฟล์ PDF จำนวนมากภายในไดเรกทอรี ใน Windows XP การค้นหา Explorer อนุญาตสิ่งนี้ แต่ช้าเกินไป มี grep เคล็ดลับที่นี่หรือไม่



ฉันต้องการที่จะรู้ว่าเครื่องมือบรรทัดคำสั่งก่อนและถ้ามีเครื่องมือ GUI แล้วมันก็จะดีเช่นกัน .. Wingrep อยู่ภายใต้ Windows เท่านั้น และฉันต้องการค้นหาเฉพาะไฟล์ PDF ดังนั้นแอปพลิเคชั่นที่ได้รับการปรับให้เหมาะกับการใช้งานนั้นดีที่สุด
iceman

คำตอบ:


6
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);
}'

ฉันเดาว่าคุณไม่ได้สังเกตเห็นคำถามที่กล่าวถึง“ Windows XP”หรือแท็กwindows-search ฉันรู้ว่าคำถาม (สับสน) เริ่มต้นด้วย"openSUSE"แต่มีการอ้างอิง Windows มากกว่าการอ้างอิง Linux; โดยเฉพาะอย่างยิ่งเมื่อคุณนับความคิดเห็นที่ตามมาของเขาเช่นกัน
Synetech

@Synetech: เขาปฏิเสธคำตอบด้วย "Wingrep is under Windows" ซึ่งแนะนำว่าเขาต้องการโซลูชัน Linux
หอยทากเชิงกล

@ Mechanicalsnail เขาปฏิเสธเพราะเป็นเครื่องมือ GUI ที่ขอเครื่องมือบรรทัดคำสั่ง
Synetech

3

ภายใต้ทั้ง 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 "นิพจน์ทั่วไปเพื่อค้นหา"

adobe จะไม่อนุญาตให้ค้นหาภายใต้ไดเรกทอรีทั้งหมดมันจะทำเช่นนั้นในไฟล์ ฉันต้องการทราบเครื่องมือบรรทัดคำสั่งก่อนและหากมีเครื่องมือ GUI ก็จะดีเช่นกัน
iceman

Adobe Reader 9 ภายใต้ Linux มีรายการเมนู "แก้ไข | ค้นหา" ซึ่งช่วยให้คุณค้นหาไฟล์ PDF ทั้งหมดในไดเรกทอรี ในบรรทัดคำสั่งวิธีการทั้งหมดที่ฉันทราบเกี่ยวข้องกับขั้นตอนของpdftotext(ซึ่งเครื่องมือเช่น Recoll จะทำโดยอัตโนมัติ)
Gilles 'หยุดความชั่วร้าย'

1
+1 สำหรับ Recoll การจัดทำดัชนีไฟล์จะประหยัดเวลาหากคุณมีมากและคุณค้นหาบ่อยๆ
หอยทากเชิงกล

1

Adobe Reader X ไม่ทำงานและจะไม่อนุญาตให้มีการค้นหาภายใต้ไดเรกทอรีทั้งหมดและไดเรกทอรีไม่เพียง แต่ในไฟล์ แต่มันไม่ได้เป็นโปรแกรมบรรทัดคำสั่ง


นั่นคือ Acrobat X รุ่นล่าสุดหรือไม่ รุ่นไหน?
iceman

ฉันลองใช้เครื่องมือสร้างดัชนี Acrobat และเรียกมันว่าดั้งเดิมเป็นคำชม recollติดตั้งบนเดเบียนอย่างคล่องแคล่วตอนนี้พยายามทำให้มันใช้งานได้สำหรับพนักงานที่ทำงานบน windows ของฉัน
คริส K

0

หากต้องการแสดงรายการไฟล์ทั้งหมดซ้ำในไดเรกทอรีหลักของคุณที่มีนามสกุลไฟล์ 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' ควรจะได้ผลลัพธ์เดียวกันในกรณีนี้
  • แทนที่จะใช้globsสำหรับการจับคู่รูปแบบชื่อไฟล์มันจะมีประโยชน์ในการใช้พลังการแสดงออกที่มากขึ้นของนิพจน์ทั่วไปและการจับคู่รูปแบบทั่วทั้งเส้นทาง ฉันรวมการฝึกที่นี่เพื่อแสดงว่าสามารถทำได้ โปรดทราบว่าเส้นทางที่จับคู่กับรูปแบบคือเส้นทางที่ปกติจะพิมพ์ ไม่ว่าจะเป็นแบบสัมพัทธ์หรือแบบสัมบูรณ์ขึ้นอยู่กับอาร์กิวเมนต์พา ธ ที่กำหนดซึ่งหากปล่อยค่าเริ่มต้นเป็นไดเรกทอรีการทำงานปัจจุบัน (' ./') ในตัวอย่างนี้พา ธ ที่จับคู่นั้นเป็นค่าสัมบูรณ์ทั้งหมด (เช่นเริ่มต้นด้วย ' /') เนื่องจาก ' ~/' ถูกขยายเป็นพา ธ สัมบูรณ์ของโฮมไดเรกทอรีของผู้ใช้ปัจจุบันและเป็นอาร์กิวเมนต์ของพา ธ เท่านั้น
  • ' $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แต่ก็เห็นได้ชัดว่าจะไม่ได้รับการยอมรับจาก

แน่นอนปรับตามความต้องการของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.