ฉันพบคำถามจะตรวจสอบได้อย่างไรว่าข้อมูลเป็นไฟล์ tar ที่ถูกต้องโดยไม่มีไฟล์? แต่ฉันสงสัยว่า: มีโซลูชันบรรทัดคำสั่งสำเร็จรูปหรือไม่?
ฉันพบคำถามจะตรวจสอบได้อย่างไรว่าข้อมูลเป็นไฟล์ tar ที่ถูกต้องโดยไม่มีไฟล์? แต่ฉันสงสัยว่า: มีโซลูชันบรรทัดคำสั่งสำเร็จรูปหรือไม่?
คำตอบ:
สิ่งที่เกี่ยวกับการรับรายชื่อของ tarball และทิ้งเอาต์พุตแทนที่จะขยายไฟล์?
tar -tzf my_tar.tar.gz >/dev/null
แก้ไขตามความคิดเห็น ขอบคุณ zrajm!
แก้ไขตามความคิดเห็น ขอบคุณ Frozen Flame! การทดสอบนี้ไม่ได้หมายความถึงความสมบูรณ์ของข้อมูล เนื่องจากได้รับการออกแบบให้เป็นยูทิลิตี้การจัดเก็บเทปการใช้งาน tar ส่วนใหญ่จะอนุญาตให้มีสำเนาไฟล์เดียวกันหลายชุด!
-z
ตัวเลือกยังไม่จำเป็น ไม่ทำอะไรเลยในโหมดแยกหรือรายการ
-z
นั่นคือกรณีของ GNU tar - คุณรู้หรือไม่ว่านี่เป็นเรื่องจริงที่อื่น (BSD ฯลฯ )?
tar.gz
หรือไม่ ข้อมูลสนับสนุนใด ๆ ?
คุณอาจใช้ตัวเลือก gzip -t เพื่อทดสอบความสมบูรณ์ของไฟล์
http://linux.about.com/od/commands/l/blcmdl1_gzip.htm
ในการทดสอบไฟล์ gzip ไม่เสียหาย:
gunzip -t file.tar.gz
ในการทดสอบไฟล์ tar ภายในไม่เสียหาย:
gunzip -c file.tar.gz | tar -t > /dev/null
ในฐานะที่เป็นส่วนหนึ่งของการสำรองข้อมูลคุณอาจเรียกใช้คำสั่งหลังและตรวจสอบค่าของ $? หลังจากนั้นสำหรับค่า 0 (สำเร็จ) หาก tar หรือ gzip มีปัญหา $? จะมีค่าที่ไม่ใช่ศูนย์
bzip2 -t file.bz2
สำหรับไฟล์ bz2
tar -t > /dev/null
(หมายเหตุ: t
vs -t
)?
หากคุณต้องการทดสอบการแตกไฟล์ 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*
> /dev/null
สำหรับตัวอย่างการทำงานด้วย
คุณยังสามารถตรวจสอบเนื้อหาของไฟล์ * .tag.gz โดยใช้pigz
(gzip ขนาน) เพื่อเร่งความเร็วในการตรวจสอบไฟล์เก็บถาวร:
pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
ฉันได้ลองใช้คำสั่งต่อไปนี้แล้วและใช้ได้ดี
bzip2 -t file.bz2
gunzip -t file.gz
อย่างไรก็ตามเราพบว่าคำสั่งทั้งสองนี้ใช้เวลานาน บางทีเราอาจต้องการวิธีที่รวดเร็วกว่านี้ในการตรวจสอบความสมบูรณ์ของไฟล์บีบอัด
ตัวเลือกที่ดีคือการใช้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.
ทั้งหมดนี้เป็นวิธีแก้ปัญหาที่ไม่เหมาะสม จากข้อมูลจำเพาะ GZIP
ID2 (การระบุตัวตน 2)
มีค่าคงที่ ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213) เพื่อระบุไฟล์ว่าอยู่ในรูปแบบ gzip
ต้องเข้ารหัสเป็นภาษาใดก็ได้ที่คุณใช้
> ใช้ตัวเลือก -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"
-v
ถ้าคุณแค่วางเอาต์พุตไปที่/dev/null
?