it-swarm-eu.dev

Jak zkontrolovat, zda soubor Unix .tar.gz je platný soubor bez dekomprese?

Našel jsem otázku Jak zjistit, zda jsou data platná tar soubor bez souboru? , ale zajímalo by mě: existuje připravené řešení příkazového řádku?

88
understack

Co takhle dostat výpis tarballu a odhodit výstup, spíše než dekomprimovat soubor?

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

Upraveno podle komentáře. Díky zrajm!

Úpravy podle komentáře. Díky Frozen Flame! Tento test v žádném případě neznamená integritu dat. Protože byl navržen jako nástroj pro archivaci pásky, většina implementací tar umožní více kopií stejného souboru!

100
Rob Wells

můžete pravděpodobně použít volbu gzip -t k testování integrity souborů 

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

Testování souboru gzip není poškozené:

gunzip -t file.tar.gz

Testování souboru tar uvnitř není poškozeno:

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

Jako součást zálohování můžete pravděpodobně spustit pouze tento příkaz a zkontrolovat hodnotu $. poté pro hodnotu 0 (úspěch). Pokud má problém buď tar Nebo gzip, $? bude mít nenulovou hodnotu.

86
John Boker

Chcete-li provést skutečný testový extrakt souboru tar bez extrahování na disk, použijte volbu -O. Tím se rozbalí extrakt na standardní výstup namísto souborového systému. Pokud je soubor tar poškozen, proces se přeruší s chybou.

Příklad neúspěšného testu tar ...

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

Pracovní příklad ...

$ 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*
27
Ossie Moore

Můžete také zkontrolovat obsah souboru * .tag.gz pomocí pigz (paralelní gzip) pro zrychlení kontroly archivu:

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

Vyzkoušela jsem následující příkaz a fungují dobře.

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

Můžeme však zjistit, že tyto dva příkazy jsou časově náročné. Možná potřebujeme nějaký rychlejší způsob, jak určit neporušené komprimované soubory. 

3
Shicheng Guo

Pěkná volba je použít tar -tvvf <filePath>, která přidá řádek, který hlásí typ souboru.

Příklad v platném souboru .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

Poškozený soubor .tar:

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

To vše jsou velmi nedostatečná řešení. Z GZIP spec

ID2 (IDentifikace 2)
Tyto mají pevné hodnoty ID1 = 31 (0x1f, 037), ID2 = 139 (0x8b, 213), aby byl soubor identifikován jako formát gzip.

Musí být kódován do jakéhokoli jazyka, který používáte.

1
Kevin Liu

> použijte volbu -O. [...] Pokud je soubor tar poškozen, proces se přeruší s chybou.

Někdy ano, ale někdy ne. Podívejme se na příklad poškozeného souboru:

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

Ukazuje: 

my_name
Fool  

Dokonce i když to provedete

echo $?

tar řekl, že nedošlo k žádné chybě:

0

ale soubor byl poškozen, má nyní "Fool" místo "Pete".

0
Sys