Znalazłem pytanie Jak ustalić, czy dane są prawidłowe w pliku tar bez pliku? , ale zastanawiałem się: czy istnieje gotowe rozwiązanie wiersza poleceń?
Znalazłem pytanie Jak ustalić, czy dane są prawidłowe w pliku tar bez pliku? , ale zastanawiałem się: czy istnieje gotowe rozwiązanie wiersza poleceń?
Odpowiedzi:
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!
-z
opcja jest również niepotrzebna. Nie robi nic w trybie wyodrębniania lub wyświetlania.
-z
Zdecydowanie tak jest w przypadku GNU tar - czy wiesz, czy tak jest w innych miejscach (BSD itp.)?
tar.gz
? Jakieś informacje pomocnicze?
prawdopodobnie możesz użyć opcji gzip -t do przetestowania integralności plików
http://linux.about.com/od/commands/l/blcmdl1_gzip.htm
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.
bzip2 -t file.bz2
dla plików bz2.
tar -t > /dev/null
(uwaga: t
vs -t
)?
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*
> /dev/null
przykładu roboczego.
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
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.
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.
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.
> 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”.
-v
jeśli tylko przesyłasz dane wyjściowe do/dev/null
?