Jak sprawdzić, czy plik Unix .tar.gz jest prawidłowym plikiem bez dekompresji?

Odpowiedzi:

122

A co powiesz na pobranie listy archiwum tar i wyrzucenie wyjścia zamiast dekompresowania pliku?

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

Edytowano zgodnie z komentarzem. Dzięki zrajm!

Edytuj zgodnie z komentarzem. Dzięki Frozen Flame! Ten test w żaden sposób nie implikuje integralności danych. Ponieważ został zaprojektowany jako narzędzie do archiwizacji na taśmie, większość implementacji tar pozwala na tworzenie wielu kopii tego samego pliku!

Rob Wells
źródło
13
Po co używać, -vjeśli tylko przesyłasz dane wyjściowe do /dev/null?
zrajm
2
True @zrajm. To chyba moja pamięć mięśniowa! (-:
Rob Wells
5
Ta -zopcja jest również niepotrzebna. Nie robi nic w trybie wyodrębniania lub wyświetlania.
asmeurer
1
@asmeurer Re: -zZdecydowanie tak jest w przypadku GNU tar - czy wiesz, czy tak jest w innych miejscach (BSD itp.)?
belacqua
2
@bobwells Ale czy pomyślne rozpakowanie lub wyświetlenie plików zawartości oznacza integralność danych tar.gz? Jakieś informacje pomocnicze?
Frozen Flame
99

prawdopodobnie możesz użyć opcji gzip -t do przetestowania integralności plików

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

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

Aby sprawdzić, czy plik gzip nie jest uszkodzony:

gunzip -t file.tar.gz

Aby sprawdzić, czy plik tar w środku nie jest uszkodzony:

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

W ramach kopii zapasowej prawdopodobnie mógłbyś po prostu uruchomić to drugie polecenie i sprawdzić wartość $? potem dla wartości 0 (sukces). Jeśli problem dotyczy tar lub gzipa, $? będzie mieć wartość różną od zera.

John Boker
źródło
3
I bzip2 -t file.bz2dla plików bz2.
asmeurer
4
Czy nie jest to po prostu użycie dwóch poleceń do zrobienia tego, co robi "tar -tzf my_tar.tar.gz> / dev / null"?
Rob Wells
Czy to nie powinno być tar -t > /dev/null(uwaga: tvs -t)?
Intrastellar Explorer
1
@IntrastellarExplorer to jest z mojej strony literówka, chociaż nadal powinno działać bez łącznika. Jestem po prostu przyzwyczajony do opcji starego stylu na tar. unix.stackexchange.com/questions/394060/…
John Boker
32

Jeśli chcesz wykonać rzeczywisty testowy rozpakowywanie pliku tar bez wypakowywania go na dysk, użyj opcji -O. Spowoduje to wyplucie ekstraktu na standardowe wyjście zamiast do systemu plików. Jeśli plik tar jest uszkodzony, proces zostanie przerwany z błędem.

Przykład nieudanego testu kulki smołowej ...

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

Przykład roboczy ...

$ 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
źródło
1
Wydaje mi się, że najlepszym testem jest ten. Naprawdę wyodrębnia każdy plik i zapewnia, że ​​nie ma błędów.
rękawy
Naprawdę użyteczne. Zrobiłem skrypt, dodać hak argument przekazać ścieżkę pliku i umieścić go na mojej drodze :) [tar -xvzf $ 1 -O> / dev / null]
smonff
@ rękawy Dlaczego uważasz, że jest to lepsze niż zaakceptowana odpowiedź? tar -tvzf hello.tgz> / dev / null również daje ten sam błąd.
dash17291
5
@ dash17291 Mówię to, ponieważ spodziewam się, że będzie to trudny problem, aby udowodnić, że we wszystkich przypadkach -tvf wyłapie wszystkie błędy lub zniekształcenia, które a -xvf. Innymi słowy, -xvf złapie to wszystko -tvf, ale nie mogę powiedzieć, że jest odwrotnie.
rękawy
Może powinieneś również użyć > /dev/nullprzykładu roboczego.
moi
12

Możesz również sprawdzić zawartość pliku * .tag.gz używając pigz(parallel gzip), aby przyspieszyć sprawdzanie archiwum:

pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
ein
źródło
Mini benchmark: uruchamianie go z pigz -cvd: 80s, podczas uruchamiania z zaakceptowaną odpowiedzią tar -tzv: 143s na archiwum 22G.
Wadih M.
jak usunąć powiadomienie z cronjob o "tar: Usuwanie wiodącego` / 'z nazw członków "podczas używania tej metody?
MaXi32
3

Wypróbowałem następujące polecenie i działają dobrze.

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

Jednak możemy stwierdzić, że te dwa polecenia są czasochłonne. Może potrzebujemy szybszego sposobu określenia nienaruszonych plików skompresowanych.

Shicheng Guo
źródło
2

Fajną opcją jest tar -tvvf <filePath>dodanie linii informującej o rodzaju pliku.

Przykład w prawidłowym pliku .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

Uszkodzony plik .tar:

> tar -tvvf corrupted.tar 
tar: Unrecognized archive format
Archive Format: (null),  Compression: none
tar: Error exit delayed from previous errors.
diegoreymendez
źródło
Dzieje się tak na tarach BSD, ale nie na tarach GNU.
mcallister
1

To wszystko są bardzo nieoptymalne rozwiązania. Ze specyfikacji GZIP

ID2 (IDentification 2)
Mają ustalone wartości ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), aby zidentyfikować plik jako zapisany w formacie gzip.

Musi być zakodowany w jakimkolwiek języku, którego używasz.

Kevin Liu
źródło
jeśli plik został obcięty, wydaje się, że do wykrycia wymagałoby to pełnej dekompresji
philwalk
0

> użyj opcji -O. [...] Jeśli plik tar jest uszkodzony, proces zostanie przerwany z błędem.

Czasami tak, ale czasami nie. Zobaczmy przykład uszkodzonego pliku:

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

To pokazuje:

my_name
Fool  

Nawet jeśli wykonasz

echo $?

tar powiedział, że nie ma błędu:

0

ale plik był uszkodzony, ma teraz „Fool” zamiast „Pete”.

Sys
źródło
Ludzie rzadko używają plików tar bez żadnej kompresji. Myślę, że twoja uwaga dotyczy tylko plików nieskompresowanych.
Jarekczek
6
Mylisz uczciwość z korupcją. Twój plik utracił integralność, ale nadal jest dopuszczalnym formatem archiwum.
Phil