จะตรวจสอบได้อย่างไรว่าไฟล์ Unix .tar.gz เป็นไฟล์ที่ถูกต้องโดยไม่ต้องยกเลิกการบีบอัด?


113

ฉันพบคำถามจะตรวจสอบได้อย่างไรว่าข้อมูลเป็นไฟล์ tar ที่ถูกต้องโดยไม่มีไฟล์? แต่ฉันสงสัยว่า: มีโซลูชันบรรทัดคำสั่งสำเร็จรูปหรือไม่?

คำตอบ:


122

สิ่งที่เกี่ยวกับการรับรายชื่อของ tarball และทิ้งเอาต์พุตแทนที่จะขยายไฟล์?

tar -tzf my_tar.tar.gz >/dev/null

แก้ไขตามความคิดเห็น ขอบคุณ zrajm!

แก้ไขตามความคิดเห็น ขอบคุณ Frozen Flame! การทดสอบนี้ไม่ได้หมายความถึงความสมบูรณ์ของข้อมูล เนื่องจากได้รับการออกแบบให้เป็นยูทิลิตี้การจัดเก็บเทปการใช้งาน tar ส่วนใหญ่จะอนุญาตให้มีสำเนาไฟล์เดียวกันหลายชุด!


13
เหตุใดจึงควรใช้-vถ้าคุณแค่วางเอาต์พุตไปที่/dev/null?
zrajm

2
ทรู @zrajm. เดาว่าเป็นความทรงจำของกล้ามเนื้อของฉันที่กำลังเตะเข้า! (-:
Rob Wells

5
-zตัวเลือกยังไม่จำเป็น ไม่ทำอะไรเลยในโหมดแยกหรือรายการ
asmeurer

1
@asmeurer Re: -zนั่นคือกรณีของ GNU tar - คุณรู้หรือไม่ว่านี่เป็นเรื่องจริงที่อื่น (BSD ฯลฯ )?
belacqua

2
@bobwells แต่การไม่บีบอัดหรือรายการไฟล์เนื้อหาที่ประสบความสำเร็จแสดงถึงความสมบูรณ์ของข้อมูลtar.gzหรือไม่ ข้อมูลสนับสนุนใด ๆ ?
Frozen Flame

99

คุณอาจใช้ตัวเลือก gzip -t เพื่อทดสอบความสมบูรณ์ของไฟล์

http://linux.about.com/od/commands/l/blcmdl1_gzip.htm

จาก: http://unix.ittoolbox.com/groups/technical-functional/shellscript-l/how-to-test-file-integrity-of-targz-1138880

ในการทดสอบไฟล์ gzip ไม่เสียหาย:

gunzip -t file.tar.gz

ในการทดสอบไฟล์ tar ภายในไม่เสียหาย:

gunzip -c file.tar.gz | tar -t > /dev/null

ในฐานะที่เป็นส่วนหนึ่งของการสำรองข้อมูลคุณอาจเรียกใช้คำสั่งหลังและตรวจสอบค่าของ $? หลังจากนั้นสำหรับค่า 0 (สำเร็จ) หาก tar หรือ gzip มีปัญหา $? จะมีค่าที่ไม่ใช่ศูนย์


3
และbzip2 -t file.bz2สำหรับไฟล์ bz2
asmeurer

4
นี่ไม่ใช่แค่การใช้สองคำสั่งเพื่อทำสิ่งที่ "tar -tzf my_tar.tar.gz> / dev / null" ทำ
Rob Wells

มันไม่ควรจะเป็นtar -t > /dev/null(หมายเหตุ: tvs -t)?
Intrastellar Explorer

1
@IntrastellarExplorer นั่นคือการพิมพ์ผิดในส่วนของฉันแม้ว่ามันจะยังใช้งานได้โดยไม่มียัติภังค์ก็ตาม ฉันคุ้นเคยกับตัวเลือกรูปแบบเก่าบนน้ำมันดิน unix.stackexchange.com/questions/394060/…
John Boker

32

หากคุณต้องการทดสอบการแตกไฟล์ tar โดยไม่ต้องแตกไฟล์ลงดิสก์ให้ใช้อ็อพชัน -O สิ่งนี้พ่นสารสกัดไปยังเอาต์พุตมาตรฐานแทนที่จะเป็นระบบไฟล์ หากไฟล์ tar เสียหายกระบวนการจะยกเลิกโดยมีข้อผิดพลาด

ตัวอย่างการทดสอบ tar ball ที่ล้มเหลว ...

$ echo "this will not pass the test" > hello.tgz
$ tar -xvzf hello.tgz -O > /dev/null
gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error exit delayed from previous errors
$ rm hello.*

ตัวอย่างการทำงาน ...

$ ls hello*
ls: hello*: No such file or directory
$ echo "hello1" > hello1.txt
$ echo "hello2" > hello2.txt
$ tar -cvzf hello.tgz hello[12].txt
hello1.txt
hello2.txt
$ rm hello[12].txt
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz -O
hello1.txt
hello1
hello2.txt
hello2
$ ls hello*
hello.tgz
$ tar -xvzf hello.tgz
hello1.txt
hello2.txt
$ ls hello*
hello1.txt  hello2.txt  hello.tgz
$ rm hello*

1
สำหรับฉันแล้วการทดสอบที่ดีที่สุดคือการทดสอบนี้ มันแตกไฟล์แต่ละไฟล์อย่างแท้จริงและทำให้แน่ใจว่าไม่มีข้อผิดพลาด
แขนเสื้อ

มีประโยชน์จริงๆ. ฉันได้สร้างเชลล์สคริปต์เพิ่มอาร์กิวเมนต์ hook เพื่อส่งเส้นทางของไฟล์และวางไว้ในเส้นทางของฉัน :) [tar -xvzf $ 1 -O> / dev / null]
smonff

@sleeves ทำไมคุณถึงคิดว่าดีกว่าคำตอบที่ได้รับการยอมรับ? tar -tvzf hello.tgz> / dev / null ยังให้ข้อผิดพลาดเดียวกัน
dash17291

5
@ dash17291 ฉันพูดแบบนี้เพราะฉันคาดว่ามันจะเป็นปัญหาที่ยากที่จะพิสูจน์ว่าสำหรับทุกกรณี a -tvf จะตรวจจับข้อผิดพลาดหรือความเสียหายทั้งหมดที่ a -xvf กล่าวอีกนัยหนึ่ง -xvf จะจับ -tvf ทั้งหมดนั้น แต่ฉันไม่สามารถพูดได้ว่าการสนทนาเป็นความจริง
แขนเสื้อ

บางทีคุณควรใช้> /dev/nullสำหรับตัวอย่างการทำงานด้วย
moi

12

คุณยังสามารถตรวจสอบเนื้อหาของไฟล์ * .tag.gz โดยใช้pigz(gzip ขนาน) เพื่อเร่งความเร็วในการตรวจสอบไฟล์เก็บถาวร:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null

เกณฑ์มาตรฐานขนาดเล็ก: ใช้งานด้วย pigz -cvd: 80s ในขณะที่ทำงานด้วยคำตอบที่ยอมรับ tar -tzv: 143s ในไฟล์เก็บถาวร 22G
Wadih M.

คุณจะลบการแจ้งเตือนจาก cronjob เกี่ยวกับ "tar: การลบเครื่องหมายนำหน้า` / 'จากชื่อสมาชิก "เมื่อใช้วิธีนี้ได้อย่างไร?
MaXi32

3

ฉันได้ลองใช้คำสั่งต่อไปนี้แล้วและใช้ได้ดี

bzip2 -t file.bz2
gunzip -t file.gz

อย่างไรก็ตามเราพบว่าคำสั่งทั้งสองนี้ใช้เวลานาน บางทีเราอาจต้องการวิธีที่รวดเร็วกว่านี้ในการตรวจสอบความสมบูรณ์ของไฟล์บีบอัด


2

ตัวเลือกที่ดีคือการใช้tar -tvvf <filePath>ซึ่งเพิ่มบรรทัดที่รายงานประเภทของไฟล์

ตัวอย่างในไฟล์. tar ที่ถูกต้อง:

> tar -tvvf filename.tar 
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:46 ./testfolder2/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:46 ./testfolder2/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:46 ./testfolder2/.DS_Store
drwxr-xr-x  0 diegoreymendez staff       0 Jul 31 12:42 ./testfolder2/testfolder/
-rw-r--r--  0 diegoreymendez staff      82 Jul 31 12:42 ./testfolder2/testfolder/._.DS_Store
-rw-r--r--  0 diegoreymendez staff    6148 Jul 31 12:42 ./testfolder2/testfolder/.DS_Store
-rw-r--r--  0 diegoreymendez staff  325377 Jul  5 09:50 ./testfolder2/testfolder/Scala.pages
Archive Format: POSIX ustar format,  Compression: none

ไฟล์. tar ที่เสียหาย:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.

สิ่งนี้เกิดขึ้นกับ BSD tar แต่ไม่ใช่ใน GNU tar
mcallister

1

ทั้งหมดนี้เป็นวิธีแก้ปัญหาที่ไม่เหมาะสม จากข้อมูลจำเพาะ GZIP

ID2 (การระบุตัวตน 2)
มีค่าคงที่ ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213) เพื่อระบุไฟล์ว่าอยู่ในรูปแบบ gzip

ต้องเข้ารหัสเป็นภาษาใดก็ได้ที่คุณใช้


หากไฟล์ถูกตัดทอนดูเหมือนว่าจะต้องมีการคลายการบีบอัดทั้งหมดเพื่อตรวจจับ
philwalk

0

> ใช้ตัวเลือก -O [... ] หากไฟล์ tar เสียหายกระบวนการจะยกเลิกโดยมีข้อผิดพลาด

บางครั้งใช่ แต่บางครั้งก็ไม่ มาดูตัวอย่างไฟล์ที่เสียหาย:

echo Pete > my_name
tar -cf my_data.tar my_name 

# // Simulate a corruption
sed < my_data.tar 's/Pete/Fool/' > my_data_now.tar
# // "my_data_now.tar" is the corrupted file

tar -xvf my_data_now.tar -O

มันแสดงให้เห็น:

my_name
Fool  

แม้ว่าคุณจะดำเนินการ

echo $?

tar กล่าวว่าไม่มีข้อผิดพลาด:

0

แต่ไฟล์เสียหายตอนนี้มี "Fool" แทน "Pete"


คนไม่ค่อยใช้ไฟล์ tar โดยไม่มีการบีบอัดใด ๆ ฉันเดาว่าคำพูดของคุณเกี่ยวกับไฟล์ที่ไม่มีการบีบอัดเท่านั้น
Jarekczek

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