Verilerin bir dosya olmadan geçerli tar dosyası olup olmadığını nasıl belirleyebilirim? Sorusunu buldum. , ama merak ediyordum: hazır bir komut satırı çözümü var mı?
Verilerin bir dosya olmadan geçerli tar dosyası olup olmadığını nasıl belirleyebilirim? Sorusunu buldum. , ama merak ediyordum: hazır bir komut satırı çözümü var mı?
Yanıtlar:
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!
-z
Seçeneği de gereksiz olduğu. Çıkarma veya liste modunda hiçbir şey yapmaz.
-z
GNU tar ile ilgili durum kesinlikle bu - bunun başka bir yerde (BSD, vb.) geçerli olup olmadığını biliyor musunuz?
tar.gz
? Herhangi bir destek bilgisi?
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
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.
bzip2 -t file.bz2
bz2 dosyaları için.
tar -t > /dev/null
(not: t
vs -t
)?
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*
> /dev/null
çalışma örneği için de kullanmalısın .
pigz
Arş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
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.
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.
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.
> -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.
-v
Çıkışı sadece borulama yapıyorsanız neden kullanasınız/dev/null
?