ฉันมีไฟล์ PDF หลายไฟล์ในโฟลเดอร์เดียว
เป็นไปได้หรือไม่ที่จะตรวจสอบว่าไฟล์อย่างน้อยหนึ่งไฟล์เสียหาย (เป็นศูนย์หน้าหรือดาวน์โหลดไม่เสร็จ) โดยใช้บรรทัดคำสั่งโดยไม่จำเป็นต้องเปิดทีละไฟล์?
ฉันมีไฟล์ PDF หลายไฟล์ในโฟลเดอร์เดียว
เป็นไปได้หรือไม่ที่จะตรวจสอบว่าไฟล์อย่างน้อยหนึ่งไฟล์เสียหาย (เป็นศูนย์หน้าหรือดาวน์โหลดไม่เสร็จ) โดยใช้บรรทัดคำสั่งโดยไม่จำเป็นต้องเปิดทีละไฟล์?
คำตอบ:
บางทีทำงานpdfinfo
(ที่นี่ใน Fedora ในpoppler-utils
แพ็คเกจ) ให้เบาะแส
ข้อมูลส่วนใหญ่ของไฟล์ PDF อยู่ในพจนานุกรมเมื่อสิ้นสุดดังนั้นหากพบว่าควรเป็น OK ฉันจะทำสิ่งที่ชอบ:
for f in *.pdf; do
if pdfinfo "$f" > /dev/null; then
: Nothing
else
echo "$f" is broken
fi
done
pdfinfo
หรือpdftotext
...
นี่คือสคริปต์ของฉัน
find . -iname '*.pdf' | while read -r f
do
if pdftotext "$f" &> /dev/null; then
echo "$f" was ok;
else
mv "$f" "$f.broken";
echo "$f" is broken;
fi;
done
เครื่องมือของฉันของทางเลือกสำหรับการตรวจสอบไฟล์ PDF qpdf
เป็น qpdf
มี--check
อาร์กิวเมนต์ที่หาปัญหาใน PDF ได้ดี
qpdf
:qpdf --check test_file.pdf
qpdf
:find ./directory_to_scan/ -type f -iname '*.pdf' \( -exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \; -o -exec echo "{}": FAILED \; \)
คำอธิบายคำสั่ง:
find ./directory_to_scan/ -type f -iname '*.pdf'
ค้นหาไฟล์ทั้งหมดที่มีนามสกุล '.pdf'
-exec sh -c 'qpdf --check "{}" > /dev/null && echo "{}": OK' \;
ดำเนินการสำหรับแต่ละไฟล์พบและท่อส่งออกทั้งหมดไปยังqpdf
/dev/null
พิมพ์ชื่อไฟล์ตามด้วย ': OK' หากสถานะการส่งคืนqpdf
เป็น 0 (เช่นไม่มีข้อผิดพลาด)
-o -exec echo "{}": FAILED \; \)
สิ่งนี้จะถูกดำเนินการหากพบข้อผิดพลาด: พิมพ์ชื่อไฟล์ตามด้วย ": FAILED"
qpdf
:qpdf
มีทั้ง Linux และ Windows ไบนารีที่: https://github.com/qpdf/qpdf/releases คุณสามารถใช้ตัวจัดการแพ็คเกจที่คุณเลือกเพื่อรับมันได้ ตัวอย่างเช่นบน Ubuntu คุณสามารถติดตั้ง qpdf โดยใช้ apt ด้วยคำสั่ง:
apt install qpdf
qpdf --check
ไม่พบข้อมูลเมตาที่กำหนดแบบทวีคูณซึ่งไม่ถูกต้องเนื่องจากข้อมูลเหล่านั้นมีการจัดการที่แตกต่างกันโดยเครื่องมือต่าง ๆ ฉันรายงานข้อบกพร่องแล้ว เครื่องมืออื่น ๆ เช่นpdfinfo
และpdftk
ไม่ทำอย่างใดอย่างหนึ่ง แต่ไม่อ้างสิทธิ์ในการตรวจสอบโครงสร้าง PDF
ฉันได้รับคำตอบตัวเอง:
for x in *.pdf; do echo "$x"; pdfinfo "$x" | grep Pages; done
PDF ที่มีข้อผิดพลาดจะแสดงข้อผิดพลาด
ls
: mywiki.wooledge.org/ParsingLs
find (1)
นี้ควรจะจัดการกับ :-)
วิธีการทั้งหมดที่ใช้pdfinfo
หรือpdftotext
ไม่ได้ผลสำหรับฉัน ในความเป็นจริงพวกเขายังให้บวกเท็จและบางครั้งฉันสร้างไฟล์ที่ฉันไม่ต้องการ
การติดตั้ง:
ติดตั้ง jar จากลิงก์ด้านบนและอัพเดตตัวแปรสภาวะแวดล้อม PATH ของคุณด้วยคำสั่งนี้:
echo "export PATH=\$PATH:/REPLACE_WITH/YOUR/PATH_TO/jhove/" >> ~/.bash_profile
รีเฟรชแต่ละเทอร์มินัลด้วย
source ~/.bash_profile
และคุณก็พร้อมที่จะเริ่มใช้งานทั้งระบบ
การใช้งานพื้นฐาน:
jhove -m pdf-hul someFile.pdf
คุณจะได้รับข้อมูลจำนวนมากเกี่ยวกับ pdf - มากกว่าคนส่วนใหญ่อาจต้องการ
Bash One-Liner:
เพียงแค่คืนvalid
หรือinvalid
:
if [[ $(jhove -m pdf-hul someFile.pdf | grep -a "Status:") == *"Well-Formed and valid"* ]]; then echo "valid"; else echo "invalid"; fi;
โปรดทราบว่านี่ทำงานบน Mac OS X แต่ฉันคิดว่ามันใช้งานได้เหมือนกันกับสภาพแวดล้อม Bash ที่ใช้ Unix