มีวิธีการค้นหาไฟล์ pdf โดยใช้พลังของ grep โดยไม่ต้องแปลงเป็นข้อความเป็นอันดับแรกใน Ubuntu หรือไม่?
มีวิธีการค้นหาไฟล์ pdf โดยใช้พลังของ grep โดยไม่ต้องแปลงเป็นข้อความเป็นอันดับแรกใน Ubuntu หรือไม่?
คำตอบ:
ติดตั้งแพ็กเกจpdfgrep
จากนั้นใช้คำสั่ง:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
------
วิธีที่ง่ายที่สุดคือ
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
ยังมีธงแบบเรียกซ้ำ pdfgrep -R pattern /path/
ดังนั้นคำตอบนี้อาจอาจจะลดลงไป: แม้ว่ามันจะมีประสิทธิภาพน้อยลงหากไฟล์นั้นผ่านทุกไฟล์แม้ว่าจะไม่ใช่ไฟล์ PDF ก็ตาม และฉันสังเกตว่ามันมีปัญหากับตัวละครนานาชาติเช่นå, äและö
-n
ตัวเลือกนี้เป็นมืออาชีพสำหรับ pdfgrep เนื่องจากช่วยให้รวมหมายเลขหน้าในผลลัพธ์ (อาจเป็นประโยชน์สำหรับการประมวลผลเพิ่มเติม)
pattern
? อะไรนะ{}
? มีอะไรขึ้นกับ `+ ' ฉันไม่รู้ว่าเมื่ออ่านครั้งแรก ... ดังนั้นไป manpage ฉันไปฉันคิดว่า
หากคุณpoppler-utils
ติดตั้ง (เริ่มต้นบน Ubuntu Desktop) คุณสามารถ "แปลง" ได้ทันทีและไปที่grep
:
pdftotext my.pdf - | grep 'pattern'
สิ่งนี้จะไม่สร้างไฟล์. txt
pdftotext
คือชื่อไฟล์ที่ควรเขียน อย่างไรก็ตามโดยทั่วไปแล้วเครื่องมือมักจะอนุญาตให้คุณเขียนstdout
แทนไฟล์ได้โดยระบุ-
แทน ในทำนองเดียวกันเครื่องมือบางอย่างจะเขียนถึงstdout
ค่าเริ่มต้นหากคุณไม่ใช้อาร์กิวเมนต์ดังกล่าวทั้งหมด (แต่ไม่สามารถทำได้ตลอดเวลาหากไม่ได้สร้างความคลุมเครือ)
pdfgrepเขียนขึ้นเพื่อจุดประสงค์นี้โดยแท้และมีอยู่ใน Ubuntu
มันพยายามที่จะเข้ากันได้เป็นส่วนใหญ่grep
และทำให้ "พลังแห่ง grep" โดยเฉพาะสำหรับ PDF ซึ่งรวมถึงตัวเลือก grep ทั่วไปเช่น--recursive
, หรือ--ignore-case
--color
ในทางตรงกันข้ามpdftotext | grep
pdfgrep สามารถส่งออกหมายเลขหน้าของการแข่งขันในลักษณะนักแสดงและโดยทั่วไปจะเร็วกว่าเมื่อไม่ต้องค้นหาเอกสารทั้งหมด (เช่น--max-count
หรือ--quiet
)
การใช้งานพื้นฐานคือ:
pdfgrep PATTERN FILE..
PATTERN
สตริงการค้นหาของคุณอยู่ที่ไหนและFILE
รายชื่อไฟล์ (หรือไวด์การ์ดในเชลล์)
เลขที่
ไฟล์ PDF ประกอบด้วยข้อมูลจำนวนหนึ่งบางส่วนเป็นข้อความรูปภาพบางรูปและบางส่วนเป็นไฟล์ XYZ แฟนซีที่น่าอัศจรรย์อย่างแท้จริง (เช่นไฟล์. u3d) ชิ้นส่วนเหล่านั้นส่วนใหญ่ถูกบีบอัด (เช่นแบนตรวจสอบhttp://www.verypdf.com/pdfinfoeditor/compression.htm ) เพื่อที่จะ 'grep' a .pdf คุณต้องย้อนกลับการบีบอัด aka แยกข้อความ
คุณสามารถทำได้ทั้งไฟล์ด้วยเครื่องมือเช่นpdf2text
และ grep ผลลัพธ์หรือคุณเรียกใช้ 'indexer' (ดูที่xapian.orgหรือlucene ) ซึ่งสร้างดัชนีที่ค้นหาได้จากไฟล์. pdf ของคุณจากนั้นคุณสามารถใช้การค้นหา เครื่องมือเอ็นจิ้นของตัวสร้างดัชนีนั้นเพื่อรับเนื้อหาของ pdf
แต่ไม่คุณไม่สามารถgrep
ไฟล์ PDF และหวังว่าจะได้คำตอบที่เชื่อถือได้โดยไม่ต้องแยกข้อความออกก่อน
pdfgrep
อยู่ (ดูด้านบน) แบน "ไม่" ไม่ถูกต้อง
Recollสามารถค้นหา PDF มันไม่รองรับการแสดงออกปกติ แต่มีตัวเลือกการค้นหาอื่น ๆ อีกมากมายดังนั้นมันอาจเหมาะสมกับความต้องการของคุณ
คุณสามารถผ่านมันได้strings
ก่อน: -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
คุณไม่จำเป็นต้องใช้cat
strings
grep
ลองดูที่เครื่องมือ grep ทรัพยากรทั่วไปcrgrepซึ่งรองรับการค้นหาภายในไฟล์ PDF
นอกจากนี้ยังช่วยให้ค้นหาทรัพยากรอื่น ๆ เช่นเนื้อหาที่ซ้อนในคลังข้อมูลตารางฐานข้อมูลเมตาดาต้าการพึ่งพาไฟล์ POM และแหล่งข้อมูลบนเว็บ - และการรวมกันของสิ่งเหล่านี้รวมถึงการค้นหาแบบเรียกซ้ำ
ลองนี้
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
สำหรับการพิมพ์บรรทัดลวดลายที่เกิดขึ้นภายใน pdf
cd ไปยังโฟลเดอร์ที่มีไฟล์ pdf ของคุณแล้ว ..
pdfgrep 'pattern' your.pdf
หรือหากคุณต้องการค้นหาไฟล์ PDF มากกว่าหนึ่งไฟล์ (เช่นในไฟล์ pdf ทั้งหมดในโฟลเดอร์ของคุณ)
pdfgrep 'pattern' `ls *.pdf`
หรือ
pdfgrep 'pattern' $(ls *.pdf)
ls
การส่งออกเป็น input ในการคำสั่งอื่น เพียงแค่pdfgrep 'pattern' *.pdf
เป็นพอ
มีคำถามซ้ำกันใน StackOverflow คนที่นั่นแนะนำการเปลี่ยนแปลงของ harish.venkarts ตอบ:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
ข้อได้เปรียบเหนือคำตอบที่คล้ายกันที่นี่คือ--with-filename
ธงสำหรับ grep สิ่งนี้ค่อนข้างดีกว่า pdfgrep เช่นกันเนื่องจาก grep มาตรฐานมีคุณสมบัติมากกว่า
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
นี่คือสคริปต์ด่วนสำหรับค้นหา pdf ในไดเรกทอรีปัจจุบัน:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "usage $0 VALUE" 1>&2
exit 1
fi
echo 'SEARCH IS CASE SENSITIVE' 1>&2
find . -name '*.pdf' -exec /bin/bash -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "$0"' $1 \;
ผมถือว่าคุณหมายถึง TP ไม่แปลงบนดิสก์คุณสามารถแปลงให้stdout
แล้ว grep pdftotext
มันด้วย การแปลงไฟล์ PDF เป็นไฟล์ ๆ โดยไม่มีการแปลงใด ๆ นั้นไม่ใช่วิธีการปฏิบัติเพราะPDF
ส่วนใหญ่เป็นรูปแบบไบนารี
ในไดเรกทอรี:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
หรือในไดเรกทอรีและไดเรกทอรีย่อย:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
นอกจากนี้เนื่องจากบางpdf
สแกนจะต้องมี OCR ก่อน ฉันเขียนวิธีง่ายๆในการค้นหาไฟล์ PDF ทั้งหมดที่ไม่สามารถgrep
ed และ OCR ได้
ฉันสังเกตว่าpdf
ไฟล์ไม่มีตัวอักษรใด ๆ มันมักจะไม่สามารถค้นหาได้ pdffonts
ดังนั้นการรู้นี้เราสามารถใช้
2 บรรทัดแรกของpdffonts
ส่วนหัวเป็นส่วนหัวของตารางดังนั้นเมื่อไฟล์ที่ค้นหาได้มีเอาต์พุตมากกว่าสองบรรทัดรู้ว่าเราสามารถสร้าง:
gedit check_pdf_searchable.sh
จากนั้นวางสิ่งนี้
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
จากนั้นทำให้สามารถเรียกใช้งานได้
chmod +x check_pdf_searchable.sh
จากนั้นแสดงรายการไฟล์ PDF ที่ไม่สามารถค้นหาได้ทั้งหมดในไดเรกทอรี:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
หรือในไดเรกทอรีและไดเรกทอรีย่อย:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
หากคุณต้องการค้นหาชื่อ / คุณสมบัติของไฟล์ PDF ... หรือสตริงแบบง่าย ๆ ที่ไม่ถูกบีบอัดหรือเข้ารหัสแล้วแทนที่จะใช้strings
คุณสามารถใช้ด้านล่าง
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
จากgrep --help
:
--binary-files=TYPE assume that binary files are TYPE;
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
และcat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB
gpdf อาจเป็นสิ่งที่คุณต้องการหากคุณใช้ Gnome! ตรวจสอบนี้ในกรณีที่คุณไม่ได้ใช้คำพังเพย มีรายการของผู้ชมไฟล์ PDF ของ CLI จากนั้นคุณสามารถใช้grep
เพื่อค้นหารูปแบบบางอย่าง