Eu encontrei a pergunta Como determinar se os dados são um arquivo tar válido sem um arquivo? , mas eu queria saber: existe uma solução de linha de comando pronta?
Eu encontrei a pergunta Como determinar se os dados são um arquivo tar válido sem um arquivo? , mas eu queria saber: existe uma solução de linha de comando pronta?
Respostas:
Que tal apenas obter uma lista do tarball e descartar a saída, em vez de descompactar o arquivo?
tar -tzf my_tar.tar.gz >/dev/null
Editado conforme comentário. Obrigado zrajm!
Edite conforme o comentário. Obrigado Frozen Flame! Este teste não implica de forma alguma integridade dos dados. Por ter sido projetado como um utilitário de arquivamento em fita, a maioria das implementações do tar permite várias cópias do mesmo arquivo!
-z
opção também é desnecessária. Não faz nada no modo de extração ou lista.
-z
Esse é definitivamente o caso do GNU tar - você sabe se isso é verdade em outro lugar (BSD, etc.)?
tar.gz
? Alguma informação de suporte?
você provavelmente poderia usar a opção gzip -t para testar a integridade dos arquivos
http://linux.about.com/od/commands/l/blcmdl1_gzip.htm
Para testar se o arquivo gzip não está corrompido:
gunzip -t file.tar.gz
Para testar se o arquivo tar interno não está corrompido:
gunzip -c file.tar.gz | tar -t > /dev/null
Como parte do backup, você provavelmente poderia apenas executar o último comando e verificar o valor de $? depois, para um valor 0 (sucesso). Se o tar ou o gzip apresentarem um problema, $? terá um valor diferente de zero.
bzip2 -t file.bz2
para arquivos bz2.
tar -t > /dev/null
(nota: t
vs -t
)?
Se você quiser fazer uma extração de teste real de um arquivo tar sem extrair para o disco, use a opção -O. Isso lança a extração para a saída padrão em vez do sistema de arquivos. Se o arquivo tar estiver corrompido, o processo será interrompido com um erro.
Exemplo de teste de tarball com falha ...
$ 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.*
Exemplo de trabalho ...
$ 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
para o exemplo de trabalho também.
Você também pode verificar o conteúdo do arquivo * .tag.gz usando pigz
(gzip paralelo) para acelerar a verificação do arquivo:
pigz -cvdp number_of_threads /[...]path[...]/archive_name.tar.gz | tar -tv > /dev/null
Tentei o seguinte comando e eles funcionam bem.
bzip2 -t file.bz2
gunzip -t file.gz
No entanto, podemos constatar que esses dois comandos são demorados. Talvez precisemos de uma maneira mais rápida de determinar a integridade dos arquivos compactados.
Uma boa opção é usar o tar -tvvf <filePath>
que adiciona uma linha que informa o tipo de arquivo.
Exemplo em um arquivo .tar válido:
> 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
Arquivo .tar corrompido:
> tar -tvvf corrupted.tar
tar: Unrecognized archive format
Archive Format: (null), Compression: none
tar: Error exit delayed from previous errors.
Todas essas são soluções muito abaixo do ideal. Da especificação GZIP
ID2 (IDentificação 2)
Eles têm os valores fixos ID1 = 31 (0x1f, \ 037), ID2 = 139 (0x8b, \ 213), para identificar o arquivo como estando no formato gzip.
Tem que ser codificado em qualquer linguagem que você esteja usando.
> use a opção -O. [...] Se o arquivo tar estiver corrompido, o processo será abortado com um erro.
Às vezes sim, mas às vezes não. Vejamos um exemplo de arquivo corrompido:
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
Isto mostra:
my_name
Fool
Mesmo se você executar
echo $?
tar disse que não houve erro:
0
mas o arquivo estava corrompido, agora tem "Fool" em vez de "Pete".
-v
se você está apenas canalizando a saída/dev/null
?