Estou com um problema bastante estranho e não consigo descobrir o que está acontecendo. Eu tenho um arquivo tgz, scip-3.2.0.tgz , que está lançando um erro quando tento descompactá-lo. O erro está ocorrendo apenas no OS X (eu estou no 10.10.4). Posso extrair o arquivo sem erro em uma caixa Linux executando o CentOS 6.6. O erro ocorre ao usar o comando da linha de tar
comandos e ao usar o utilitário de arquivamento. Enviei por email a lista de discussão SCIP e tenho o mesmo hash SHA-1 que outro usuário ( e085a4a3591eddf945dcb365d97d2512c267e374
), portanto, não houve um erro de download. Eles não têm certeza do que está acontecendo.
Aqui está o erro que recebo ao tentar descompactar usando o utilitário de arquivamento:
Caso a imagem se quebre, o texto na imagem diz o seguinte:
Não foi possível expandir "scip-3.2.0.tgz" para "Área de trabalho".
(Erro 1 - Operação não permitida.)
E quando tento descompactar via linha de comando, essa é a saída que recebo . É a última linha ( tar: Error exit delayed from previous errors.
) que me preocupa. Não vejo o que está causando isso. O arquivo parece extraído sem problemas, mas não confio nele com esse erro.
Alguém sabe o que está causando isso?
[edit]
Olhando um pouco mais de perto a saída, a linha 1108 contém o erro:
x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'
tar
comando que vem com o OS X.gunzip -c scip-3.2.0.tgz | tar xopf -
na linha de comando, como o usaria para o seu script?gunzip
funciona muito bem, mas quando tento extrair o tarball descompactado, é quando o erro é gerado.Respostas:
Isso deve ajudar a identificar o que está acontecendo na resposta de Johnny , bem como responder à pergunta de por que isso funciona no Linux, mas não no Mac.
O problema está no fato de o Mac OS X usar
bsdtar
, enquanto a maioria dos sistemas Linux usagnutar
.Você pode instalar
gnutar
em um Mac com Homebrew, usandobrew install gnu-tar
, que vai ligar simbolicamentegnutar
em/usr/local/bin
comogtar
.Se você instalar
gnutar
, poderá reproduzir o problema seguindo as etapas na resposta de Johnny .Então, obviamente,
gnutar
arquiva as coisas de maneira diferente, de maneira que causabsdtar
engasgos com duplicatas. O fato degtar -ztvf test.tar.gz
indicar que a segunda instânciatest/a
é arquivada como alink to test/a
é relevante. Como Johnny aponta nos comentários,gnutar
ele armazenará duplicatas como links físicos em vez do arquivo real, que pode ser desativado--hard-dereference
.Ou seja, você pode fazer o seguinte:
No entanto, nesse caso, você obviamente não controla a criação do tarball, portanto
--hard-dereference
não é uma opção. Felizmente, com base na resposta do OP , parece que esse problema foi corrigido pelo montante.No entanto, se alguém mais enfrentar esse problema no futuro e precisar de uma solução rápida ou tiver um mantenedor upstream que não responda, há uma solução alternativa.
Depois de identificar qual é o arquivo duplicado, você pode usar a
--fast-read
opção debsdtar
(observe que essa opção é apenas parte delabsdtar
, nãognutar
):Portanto, no exemplo de brinquedo que eu criei após o exemplo de brinquedo na resposta de Johnny , o arquivo duplicado é
test/a
. Portanto, você pode evitar esse problema fazendo o seguinte:Além disso,
gnutar
é perfeitamente feliz descompactar um arquivo com duplicatas criadas por si só, mesmo quando a--hard-dereference
opção não foi usada:Portanto, isso responde à sua pergunta de por que um erro é gerado no Mac, mas não no Linux. (A maioria) das distribuições Linux são fornecidas e
gnutar
, como o pacote foi presumivelmente empacotadognutar
, não haverá erro ao descompactargnutar
, mas haverá um erro ao descompactarbsdtar
.Para leituras e referências adicionais, pode-se considerar quais são as diferenças entre o bsdtar e o GNU tar? no Unix.SE.
fonte
gtar -tcvf
, o gnutar é "inteligente" o suficiente para otimizar o segundo arquivo de cópia como um link, em vez de duplicá-lo no arquivo.--hard-dereference
opção desativa esse comportamento.A existência de um arquivo duplicado no arquivo morto não deve torná-lo inválido ou incapaz de ser extraído no OSX, pois, por padrão, o tar substitui as duplicatas.
Então, eu estou um pouco confuso com o comportamento na sua Síntese - OSX tar permite por arquivos duplicados em um arquivo (um retrocesso para seu propósito original como um t macaco ar cebolinha utilidade, por isso permite que arquivos sejam anexados ao final de o arquivo de fita e, quando o arquivo for restaurado, a versão mais recente do arquivo substituirá a (s) versão (ões) mais antiga (s)
É somente quando a opção "-k" está presente que o tar deve avisar sobre arquivos preexistentes.
Aqui, criei um arquivo com um arquivo duplicado e o extraí sem problemas. Não foi até eu adicionar a opção -k que me avisou sobre o arquivo duplicado:
Um problema simples de umask também não parece ser o culpado, tentei alterar meu umask para 0777 e ainda posso extrair o arquivo:
Eu pensei que poderia duplicar o problema anexando deliberadamente um diretório não gravável ao arquivo, mas isso não funcionou, o tar não atualizou as permissões no diretório quando extraiu o arquivo:
Também tentei alterar as permissões no teste / a para 000, anexando-o ao arquivo e, em seguida, acrescentando outro teste / a, mas esse também funcionou bem:
Então, eu realmente gostaria de ver o arquivo original que causou o problema e o que poderia estar naquele arquivo para causar esse problema.
Se um nome de arquivo e um diretório compartilham o mesmo nome, o tar tem um problema ao extrair, mas há uma mensagem de erro bastante clara:
(se o conflito aconteceu ao contrário, ou seja, um arquivo veio primeiro, um diretório com o mesmo nome veio depois, o tar o remove e cria o diretório:
fonte
Acontece que o utilitário tar do OS X foi o correto! Houve realmente um erro no arquivo. Esse segmento de email discute isso com mais detalhes, mas o problema é que há um arquivo duplicado no arquivo morto . O pessoal do SCIP está consertando o arquivo enquanto digito isso.
[edit]
O scip-3.2.0.tgz recém-atualizado agora está sendo extraído muito bem! O hash SHA-1 do novo tgz é
5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476
.[editar 2]
Não é que haja um erro no arquivo. Simplesmente
bsdtar
, que é fornecido com o OS X, lida com arquivos duplicados de maneira diferentegnutar
, que é fornecido com o Linux. A resposta de @Adam Liter aqui fornece uma explicação completa do que está acontecendo.fonte
-k
opção, o que faria com que fosse avisado sobre arquivos preexistentes. Infelizmente, eles já atualizaram oscip-3.2.0.tgz
arquivo para remover o dupe, então não posso testar esse arquivo.tar
extrato reage de maneira diferente ao tentar extrairscip-3.2.0/applications/Coloring/Makefile
duas vezes, dependendo do seuumask
. Se o primeiro criado não deixar um acesso de gravação, a segunda tentativa falhará.Existe um software de arquivamento alternativo, gratuito e leve que eu uso no Mac OSX. Chama-se Keka e eu o uso para descompactar o 7zip mais especificamente. Além disso, ele pode descompactar outros tipos como .rar, .tar, .gz etc. Também funcionou para o arquivo tar específico do OP, mas tentei depois que o @Geoff mencionou que a equipe estava trabalhando na reparação do arquivo.
fonte