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!


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.


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*

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

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.


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.

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.


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”.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.