Bagaimana cara memeriksa apakah file Unix .tar.gz adalah file yang valid tanpa membuka kompresi?

Jawaban:

122

Bagaimana dengan hanya mendapatkan daftar tarball dan membuang hasilnya, daripada mendekompresi file?

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

Diedit sesuai komentar. Terima kasih zrajm!

Edit sesuai komentar. Terima kasih Frozen Flame! Tes ini sama sekali tidak menyiratkan integritas data. Karena ini dirancang sebagai utilitas pengarsipan tape, sebagian besar implementasi tar akan memungkinkan banyak salinan dari file yang sama!

Rob Wells
sumber
13
Mengapa menggunakan -vjika Anda hanya menyalurkan output ke /dev/null?
zrajm
2
Benar @rjm. Tebak itu ingatan ototku! (-:
Rob Wells
5
The -zopsi juga tidak dibutuhkan. Itu tidak melakukan apa pun dalam mode ekstrak atau daftar.
asmeurer
1
@asmeurer Re: -zItu benar-benar kasus dengan GNU tar - apakah Anda tahu apakah ini benar di tempat lain (BSD, dll.)?
belacqua
2
@bobwells Tetapi apakah pembongkaran yang berhasil atau daftar file konten menyiratkan integritas data dari tar.gz? Ada informasi dukungan?
Frozen Flame
99

Anda mungkin dapat menggunakan opsi gzip -t untuk menguji integritas file

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

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

Untuk menguji file gzip tidak rusak:

gunzip -t file.tar.gz

Untuk menguji file tar di dalamnya tidak rusak:

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

Sebagai bagian dari pencadangan, Anda mungkin dapat menjalankan perintah terakhir dan memeriksa nilai $? setelah itu untuk nilai 0 (berhasil). Jika tar atau gzip bermasalah, $? akan memiliki nilai bukan nol.

John Boker
sumber
3
Dan bzip2 -t file.bz2untuk file bz2.
asmeurer
4
Bukankah ini hanya menggunakan dua perintah untuk melakukan apa yang "tar -tzf my_tar.tar.gz> / dev / null" lakukan?
Rob Wells
Bukankah seharusnya tar -t > /dev/null(catatan: tvs -t)?
Penjelajah Intrastellar
1
@IntrastellarExplorer itu salah ketik di pihak saya, meskipun seharusnya masih berfungsi tanpa tanda hubung. Saya hanya terbiasa dengan opsi gaya lama pada tar. unix.stackexchange.com/questions/394060/…
John Boker
32

Jika Anda ingin melakukan uji coba ekstrak file tar tanpa mengekstrak ke disk, gunakan opsi -O. Ini memuntahkan ekstrak ke keluaran standar, bukan ke sistem berkas. Jika file tar rusak, proses akan dibatalkan dengan kesalahan.

Contoh tes bola tar yang gagal ...

$ 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.*

Contoh Kerja ...

$ 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*
Ossie Moore
sumber
1
Bagi saya, tes terbaik adalah yang ini. Ini benar-benar mengekstrak setiap file dan memastikan tidak ada kesalahan.
lengan baju
Sangat berguna. Saya telah membuat skrip shell, menambahkan hook argumen untuk melewati jalur file dan meletakkannya di jalur saya :) [tar -xvzf $ 1 -O> / dev / null]
smonff
@sleeves Mengapa menurut Anda itu lebih baik daripada jawaban yang diterima? tar -tvzf hello.tgz> / dev / null juga memberikan kesalahan yang sama.
dasbor17291
5
@ dash17291 Saya mengatakan ini karena saya berharap ini menjadi masalah yang sulit untuk membuktikan bahwa untuk semua kasus, -tvf akan menangkap semua kesalahan atau kerusakan yang -xvf. Dengan kata lain, -xvf akan menangkap semua itu -tvf, tapi saya tidak bisa mengatakan kebalikannya benar.
lengan baju
Mungkin Anda harus menggunakan > /dev/nullcontoh kerja juga.
moi
12

Anda juga dapat memeriksa konten file * .tag.gz menggunakan pigz(parallel gzip) untuk mempercepat pemeriksaan arsip:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
ein
sumber
Tolok ukur mini: menjalankannya dengan pigz -cvd: 80s, sambil menjalankan dengan jawaban tar -tzv: 143s yang diterima pada arsip 22G.
Wadih M.
bagaimana Anda menghapus notifikasi dari cronjob tentang "tar: Menghapus` / 'dari nama anggota "saat menggunakan metode ini?
MaXi32
3

Saya telah mencoba perintah berikut dan mereka bekerja dengan baik.

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

Namun, kami dapat menemukan dua perintah ini memakan waktu. Mungkin kita membutuhkan cara yang lebih cepat untuk menentukan utuh dari file kompres.

Shicheng Guo
sumber
2

Pilihan yang bagus adalah menggunakan tar -tvvf <filePath>yang menambahkan baris yang melaporkan jenis file.

Contoh dalam file .tar yang valid:

> 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

File .tar rusak:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.
diegoreymendez
sumber
Ini terjadi pada tar BSD tetapi tidak pada tar GNU.
mcallister
1

Ini semua adalah solusi yang sangat kurang optimal. Dari spesifikasi GZIP

ID2 (IDentification 2)
Ini memiliki nilai tetap ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), untuk mengidentifikasi file sebagai dalam format gzip.

Harus dikodekan ke dalam bahasa apa pun yang Anda gunakan.

Kevin Liu
sumber
jika file telah terpotong, itu tampaknya memerlukan dekompresi penuh untuk mendeteksi
philwalk
0

> gunakan opsi -O. [...] Jika file tar rusak, proses akan dibatalkan dengan kesalahan.

Terkadang ya, terkadang tidak. Mari kita lihat contoh file yang rusak:

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

Itu menunjukkan:

my_name
Fool  

Bahkan jika Anda mengeksekusi

echo $?

tar mengatakan bahwa tidak ada kesalahan:

0

tetapi file tersebut rusak, sekarang menjadi "Bodoh" bukan "Pete".

Sys
sumber
Orang jarang menggunakan file tar tanpa kompresi apapun. Saya rasa komentar Anda hanya berkaitan dengan file yang tidak terkompresi.
Jarekczek
6
Anda mengacaukan integritas dengan korupsi. File Anda telah kehilangan integritasnya tetapi masih dalam format arsip yang dapat diterima.
Phil