ทดสอบความสมบูรณ์ของไฟล์ tar ใน bash


25

ฉันมีสคริปต์ทุบตีที่สร้างไฟล์ '.tar' เมื่อสร้างไฟล์แล้วฉันต้องการทดสอบความสมบูรณ์ของไฟล์และส่งอีเมลไปยังผู้ใช้รูทหากความถูกต้องไม่ดี

ฉันรู้ว่าฉันจะต้องใช้คำสั่งtar -tf /root/archive.tarเพื่อตรวจสอบความสมบูรณ์ของไฟล์ แต่ฉันจะใช้สิ่งนี้ใน bash if คำสั่งและตรวจสอบข้อผิดพลาดได้อย่างไร

คำตอบ:


33

หากtarพบข้อผิดพลาดในการป้อนข้อมูลมันจะexit(3)¹ด้วยค่าทางออกที่ไม่ใช่ศูนย์ นี้ - ส่วนใหญ่tarการใช้งาน - tจะทำยังเมื่อรายการเนื้อหาเก็บด้วย ดังนั้นคุณสามารถตรวจสอบค่าทางออกของtarเพื่อตรวจสอบว่ามีบางอย่างผิดปกติหรือไม่:

if ! tar tf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

หากคุณtarไม่พบข้อผิดพลาดทั้งหมดtคุณยังสามารถแยกเก็บถาวรstdoutและเปลี่ยนเส้นทางstdoutไปยัง/dev/nullซึ่งจะเป็นวิธีที่ช้ากว่า แต่น่าเชื่อถือกว่า:

if ! tar xOf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

not สัญกรณ์นี้แสดงถึง manpage ไม่ใช่การโทรจริง man 3 exitดู


1
คุณอาจต้องการเปลี่ยนเส้นทางtarผลลัพธ์/dev/nullเนื่องจากคุณอาจไม่ต้องการเห็นผลลัพธ์
เควิน

1
tarการใช้งานไม่ทั้งหมดตรวจพบหรือรายงานข้อผิดพลาดทั้งหมดด้วยt( bsdtarไม่ได้คุณสามารถใช้งานได้tar xOf file.tar > /dev/null) ไม่ได้ทุกtarการใช้งานที่จะออกจากที่มีสถานะทางออกที่ 2, star(255) OT bsdtar(1) ไม่ได้ แต่สิ่งที่สำคัญคือว่าสถานะทางออกที่ไม่ใช่ศูนย์ที่นี่
Stéphane Chazelas

1
ฉันแก้ไขโพสต์ของฉันตาม เมื่อexit(2)ฉันเกี่ยวข้องกับ manpage ที่เหมาะสมไม่ใช่ค่าทางออกที่แน่นอน (ซึ่งเป็นสาเหตุที่ฉันมี»ไม่ใช่ศูนย์«กล่าวถึงอย่างชัดเจนในประโยคต่อไปนี้) บันทึกย่อนี้ (และเปลี่ยนส่วนเป็น one -.- ด้านขวา)
Andreas Wiese

คำตอบของคุณเกี่ยวกับความสามารถในการแสดงรายการและการแยกข้อมูลเท่านั้นหากฉันเปิดไฟล์เก็บถาวร tar ด้วยเครื่องมือแก้ไขและเปลี่ยนบางสิ่งที่โซลูชันของคุณจะไม่พบข้อผิดพลาดใด ๆ ... ขออภัย
THESorcerer

0

ขออภัยดูเหมือนว่า tar จะไม่มีความสามารถในการทดสอบ (เช่นถ้าคุณลืม * nix และลองทดสอบด้วย winrar ผลลัพธ์จะเป็น: "คำสั่งไม่รองรับไฟล์เก็บถาวรประเภทนี้")

วิธีที่ฉันชี้ให้เห็นในความคิดเห็นด้านบน tar อย่างแท้จริงขาด CRC ภายในเพื่อให้มีเงื่อนไขของการเปรียบเทียบดังนั้นถ้าคุณเปลี่ยนการเก็บถาวร tar ด้วยตัวแก้ไขรายการและการแยกอาจทำงานได้อย่างไร้ที่ติโดยไม่มีข้อผิดพลาด แต่ดึงข้อมูลที่เสียหาย

โดยสรุปฉันจบที่นี่หวังว่าจะได้คำตอบ แต่ไม่มีสักคนโชคดีที่มีข่าวดีสองประการ:

มีมากมาก tar เก็บถาวรหายากมากที่ไม่ได้บีบอัดด้วยโปรแกรมอื่น (เช่น gzip, bzip2 ฯลฯ ) ดังนั้นโปรแกรมจะมีวิธีการทดสอบและผู้ที่ไม่บีบอัดพวกเขาเป็นง่อยจริง ๆ อ่อนแอ

สำหรับปัญหาส่วนตัวของฉันฉันโชคดีหลังจากแตกไฟล์ฉันเพิ่งพบไฟล์ md5sum ที่มี CRC ของไฟล์ทั้งหมดที่อยู่ข้างใน (แม้แต่คนที่ใส่ arhive tar บนเน็ตและไม่ต้องการบีบอัดมันก็ยังต้องการ สามารถตรวจสอบได้)


-5

คุณสามารถทำได้โดยส่งอาร์กิวเมนต์ต่อไปนี้ไปที่tar:

$ tar -cvzf test.tar test_file

2
คำตอบแบบบรรทัดเดียวมักไม่เป็นประโยชน์ พิจารณาขยายโพสต์ของคุณเพื่อรวมเนื้อหาต้นฉบับ (เช่นเอกสารประกอบ) ที่รองรับโซลูชันของคุณ
HalosGhost

6
-cสร้างไฟล์ชื่อผ่าน-f('test.tar') -zเก็บไฟล์ gzips -vทำให้มัน verbose ฉันค่อนข้างมั่นใจว่านี่ไม่ใช่ทางออกที่ถูกต้อง
EpicVoyage
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.