Bir Unix .tar.gz dosyasının sıkıştırmayı açmadan geçerli bir dosya olup olmadığı nasıl kontrol edilir?


Yanıtlar:


122

Dosyayı açmak yerine tarball listesinin bir listesini alıp çıktıyı atmaya ne dersiniz?

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

Yoruma göre düzenlendi. Teşekkürler zrajm!

Yoruma göre düzenleyin. Teşekkürler Frozen Flame! Bu test hiçbir şekilde verilerin bütünlüğünü ima etmez. Teyp arşivleme aracı olarak tasarlandığından, çoğu tar uygulaması aynı dosyanın birden çok kopyasına izin verir!


13
-vÇıkışı sadece borulama yapıyorsanız neden kullanasınız /dev/null?
zrajm

2
Doğru @zrajm. Sanırım kas hafızam devreye giriyor! (-:
Rob Wells

5
-zSeçeneği de gereksiz olduğu. Çıkarma veya liste modunda hiçbir şey yapmaz.
asmeurer

1
@asmeurer Re: -zGNU tar ile ilgili durum kesinlikle bu - bunun başka bir yerde (BSD, vb.) geçerli olup olmadığını biliyor musunuz?
belacqua

2
@bobwells Ama başarılı alan açma veya içerik dosyaları listeleme yok veri bütünlüğünü ima tar.gz? Herhangi bir destek bilgisi?
Dondurulmuş Alev

99

dosyaların bütünlüğünü test etmek için muhtemelen gzip -t seçeneğini kullanabilirsiniz

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

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

Gzip dosyasının bozuk olmadığını test etmek için:

gunzip -t file.tar.gz

Tar dosyasının içindeki bozuk olmadığını test etmek için:

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

Yedeklemenin bir parçası olarak, muhtemelen ikinci komutu çalıştırıp $ değerini kontrol edebilirsiniz. daha sonra 0 (başarı) değeri için. Tar veya gzip'te bir sorun varsa, $? sıfır olmayan bir değere sahip olacaktır.


3
Ve bzip2 -t file.bz2bz2 dosyaları için.
asmeurer

4
"Tar -tzf my_tar.tar.gz> / dev / null" ın yaptığını yapmak için sadece iki komut kullanmak değil mi?
Rob Wells

Olması gerekmiyor mu tar -t > /dev/null(not: tvs -t)?
Intrastellar Explorer

1
@IntrastellarExplorer benim açımdan bir yazım hatası, ancak yine de tire olmadan çalışması gerekiyor. Katran üzerindeki eski tarz seçeneklere alışkınım. unix.stackexchange.com/questions/394060/…
John Boker

32

Bir tar dosyasının gerçek bir test ekstresini diske çıkarmadan yapmak istiyorsanız, -O seçeneğini kullanın. Bu, özü dosya sistemi yerine standart çıktıya püskürtür. Tar dosyası bozuksa, işlem bir hata ile durdurulur.

Başarısız katran topu testi örneği ...

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

Çalışma Örneği ...

$ 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
Bana öyle geliyor ki en iyi test bu. Her dosyayı gerçekten çıkarır ve hata olmadığından emin olur.
kollu

Gerçekten kullanışlı. Bir kabuk betiği yaptım, dosyanın yolunu iletmek için bir argüman kancası
ekledim

@sleeves Neden kabul edilen cevaptan daha iyi olduğunu düşünüyorsunuz? tar -tvzf merhaba.tgz> / dev / null da aynı hatayı verir.
dash17291

5
@ dash17291 Bunu söylüyorum çünkü tüm durumlar için a -tvf'nin a -xvf olan tüm hataları veya bozulmaları yakalayacağını kanıtlamanın zor bir sorun olmasını bekliyorum. Başka bir deyişle, -xvf tüm bunları -tvf'yi yakalayacaktır, ancak tersinin doğru olduğunu söyleyemem.
kollu

Belki > /dev/nullçalışma örneği için de kullanmalısın .
moi

12

pigzArşiv denetimini hızlandırmak için * .tag.gz dosyasının içeriğini (paralel gzip) kullanarak da kontrol edebilirsiniz :

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

Mini kıyaslama: kabul edilen cevap tar -tzv: 143s 22G arşivinde çalışırken pigz -cvd: 80s ile çalıştırılır.
Wadih M.

Bu yöntemi kullanırken cronjob'tan "tar: Baştaki` / 'üye adlarından kaldırılıyor "hakkındaki bildirimi nasıl kaldırırsınız?
MaXi32

3

Aşağıdaki komutu denedim ve iyi çalışıyorlar.

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

Ancak, bu iki komutun zaman alıcı olduğunu görebiliriz. Belki sıkıştırılmış dosyaların sağlam olup olmadığını belirlemek için daha hızlı bir yola ihtiyacımız var.


2

tar -tvvf <filePath>Dosya türünü bildiren bir satır ekleyen bir seçenek, kullanmaktır .

Geçerli bir .tar dosyasındaki örnek:

> 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

Bozuk .tar dosyası:

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

Bu BSD tar üzerinde meydana gelir ancak GNU tar üzerinde olmaz.
mcallister

1

Bunların hepsi çok yetersiz çözümlerdir. Gönderen GZIP spec

ID2 (IDentification 2)
Dosyayı gzip biçiminde tanımlamak için bunlar sabit ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213) değerlerine sahiptir.

Kullandığınız dilde kodlanmalıdır.


dosya kesilmişse, bunun algılanması için tam açma işlemi gerektirecek gibi görünüyor
philwalk

0

> -O seçeneğini kullanın. [...] tar dosyası bozuksa, işlem bir hata ile durdurulur.

Bazen evet, ama bazen değil. Bozuk bir dosya örneğini görelim:

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

Gösteriyor:

my_name
Fool  

Sen infaz etsen bile

echo $?

tar, hata olmadığını söyledi:

0

ancak dosya bozulmuş, artık "Pete" yerine "Aptal" var.


İnsanlar nadiren tar dosyalarını sıkıştırma olmadan kullanırlar. Sanırım yorumunuz yalnızca sıkıştırılmamış dosyalar ile ilgili.
Jarekczek

6
Dürüstlük ile yozlaşmayı karıştırıyorsunuz. Dosyanız bütünlüğünü kaybetti, ancak yine de kabul edilebilir bir arşiv formatı.
Phil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.