Incompatibilidade tar do Linux / OS X - tarballs criados no OS X dão erros quando desarticulados no Linux

106

Quando eu tar arquivos no meu Macbook e descompactá-los no Linux, recebo repetidamente os seguintes avisos / erros:


 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Ignoring unknown extended header keyword `SCHILY.dev'
 tar: Ignoring unknown extended header keyword `SCHILY.ino'
 tar: Ignoring unknown extended header keyword `SCHILY.nlink'
 tar: Error exit delayed from previous errors

Felizmente, isso NÃO afeta os arquivos armazenados no arquivo, que são restaurados perfeitamente. No entanto, ele causa problemas em vários cenários, especialmente ao lidar com processos de compilação nos quais o código de falha diferente de zero retornado por 'tar' faz com que as compilações e as instalações parem desnecessariamente.

Como posso fazer com que o OS X construa arquivos tar que funcionam bem com o resto do mundo Linux?

Além disso, para pontos de bônus, existe um arquivo tar distribuído publicamente com esses problemas. Existe alguma maneira de o Linux manipular o arquivo tar normalmente sem alterar a maneira como ele foi originalmente compactado?

Dave Dopson
fonte

Respostas:

71

Pesquisei no Google a mensagem de erro e parece um problema BSD tar vs. GNU tar.

Instale o GNU, tarse puder, no Mac OS e use-o para criar o tar.

holygeek
fonte
17
O Mac OS X 10.6 usa um tar BSD por padrão, mas também é fornecido com um gnutar em /usr/bin/gnutar.
@Ned. Valeu. essa é uma boa informação.
Dave Dopson
15
FYI: / usr / bin / gnutar não é enviado mais com Mac OS X (pelo menos a partir de Mavericks)
foobar
sudo port instalar gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / tar gnutar
chaosless
Se estiver usando o MacPorts, você também pode colocar / opt / local / libexec / gnubin / na parte superior do seu PATH, em vez de remover qualquer coisa de / usr / bin ou criar manualmente links simbólicos.
Lorrin
62

Se você estiver usando o Mavericks ou mais recente, o gnutar não será mais incluído por padrão.

A solução alternativa, se você usar o homebrew, é executar o seguinte:

brew install gnu-tar

Você pode usar o comando gtarpara compatibilidade com linux.


Se você deseja substituir tarcom gtar, basta substituir o link simbólico

tar --version
ll `which tar`
sudo unlink `which tar`
sudo ln -s `which gtar` /usr/bin/tar
tar --version

Para restaurar o tar original fornecido com o Mac Os X, execute os comandos acima, mas substitua which gtarporwhich bsdtar

Fonte:
https://github.com/jordansissel/fpm/issues/576

spuder
fonte
4
Não há necessidade de desvincular mais, como cerveja instrui, você pode simplesmente adicionar este à sua PATH em .bashrc(ou seu equivalente):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty
1
Ou apenas criar um tarlink no /usr/local/binpor cd /usr/local/bin ; ln -s gtar tar- possivelmente a opção mais simples
Karthik T
27

O tar GNU não gosta de algumas informações opcionais que o tar OSD BSD padrão inclui.

O GNU tar permitirá que você suprima esses avisos com a opção:

--warning=no-unknown-keyword

Veja: https://www.gnu.org/software/tar/manual/html_section/tar_27.html

Observe que o tar BSD não suporta esse sinalizador, portanto, se você precisar executar o mesmo código de descompactação em todas as plataformas, poderá usar algo como:

isGnuTar=$(tar --version | grep -q 'gnu')
if [ $? -eq 0 ]
then
    echo "Detected GNU tar"
    tar --warning=no-unknown-keyword -zxf my.tar.gz
else
    tar -zxf my.tar.gz
fi
Chris
fonte
5
essa deve ser a resposta certa, pois não envolve a instalação de uma ferramenta totalmente nova para suprimir um único aviso.
cz
10

Para extrair o arquivo tar corretamente, sem erros em um sistema Linux, você pode usar o bsdtar.

sudo apt-get install bsdtar

Então use como normal.

bsdtar -xvf file.tarOnde file.tarestá o arquivo tar que você deseja extrair.

Fonte: https://bugs.launchpad.net/ubuntu/+source/tar/+bug/129314

Como alternativa, você também pode usar o rolo de arquivos GNOME.

daka
fonte
6
COPYFILE_DISABLE=1 tar cf filename.tar

ou

tar --disable-copyfile cf filename.tar

Esse é o recurso menos detectável do tar no OS X que eu conheço pessoalmente.

Veja também Por que obtenho arquivos como ._foo no meu tarball no OS X?


Editar: parece que isso só pode interromper a criação dos ._fooarquivos indesejados , não interrompe a criação do cabeçalho (pelo menos no Yosemite / 10.10); obrigado comentadores por apontar. No entanto, (para os pontos de bônus :), você pode lidar com esses tarballs graciosamente extraindo-os assim:

tar xf filename.tar --pax-option=delete=SCHILY.*,delete=LIBARCHIVE.*

Isso funcionou usando o gnu tar 1.15.1, que é bem antigo! Como alternativa, você pode usar o pax, que (para mim) lança as informações extras em um PaxHeaderdiretório, mas pelo menos sai sem erro:

pax -rf filename.tar
Zac Thompson
fonte
Infelizmente, isso não parece interromper os avisos estendidos de palavras-chave do cabeçalho ao desarmar com o gnutar.
JJC 21/09
Nenhum destes parece funcionar em Yosemite ( tar --versionindica bsdtar 2.8.3 - libarchive 2.8.3). Também preciso de um traço antes cfno último caso.
Tripleee
4

O MacOSX já vem com o gnutar. Se você deseja uma solução rápida e suja, adicione-o ao~/.bash_profile

alias tar='gnutar'

e corra source ~/.bash_profilepara atualizar

Além disso, o OSX é fornecido com alcatrão GNU e BSD. Então você também pode desvincular a ref do tar do bsd para o gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar
Du3
fonte
1
Por que dentro /etc/hosts? /etc/hostsé para mapeamento de host / IP, certo?
precisa saber é o seguinte
1
o que @BenjiWiebe disse. O mais estranho ainda é editar / etc / hosts. Eu acho que você quis dizer ~ / .bashrc
Dave Dopson
2
No OS X, .bashrcnão é carregado para sessões do Terminal. Você precisa .bash_profile, pois um shell de login é iniciado com uma nova janela do Terminal. / cc @BenjiWiebe
slhck 21/02
Correto :-) Eu também estava trabalhando no / etc / hosts naquela época, então ele foi lançado no teclado. Boa captura
Du3
2

Obrigado. Este tópico foi muito útil. Se você estiver usando o MacPorts, aqui está um rápido tutorial:

sudo port install gnutar

sudo ln -s /usr/local/opt/gnu-tar/libexec/gnubin/tar /usr/bin/gnutar

sudo ln -s /opt/local/libexec/gnubin/tar /usr/bin/gnutar

Adicione a seguinte linha a /Users/[yourname}/.profile

alias tar='/opt/local/libexec/gnubin/tar'

Saia e reinicie a janela do Terminal.

howdytom
fonte
1

Sim, o binário alcatrão incorporado do Mac adiciona um monte de coisas extras que o CentOS não gosta. Para corrigir isso, faça o seguinte:

sudo mv /usr/bin/tar /usr/bin/darwintar
sudo ln -s /usr/bin/gnutar /usr/bin/tar
ls -l /usr/bin/tar

Espero que ajude!

Shaheen Ghiassy
fonte
Essa é uma maneira. Resolvi o problema do GNU / BSD de maneira mais abrangente em github.com/ddopson/dotfiles . Eu tenho ~ / bin / coreutils no início do caminho e existem pequenos calços por aí, como github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar, que escolhem o executável correto com base no Linux vs Mac e se o ambiente COREUTILS variável está definida
Dave Dopson
Você pode modificar suas instruções para instruir as pessoas a verificar a existência de / usr / bin / gnutar antes de mover o alcatrão em funcionamento. Os novatos podem encontrar isso usando o google e não sabem como descompactar o sistema.
msouth
Provavelmente não é uma boa ideia, por algumas razões. 1) Agora, os pacotes da Apple não sabem onde encontrar o alcatrão nativo, o alcatrão que sabe como lidar com os atributos de arquivo da Apple. 2) Se você deve usar o GNU tar, o local apropriado para colocá-lo à frente no seu caminho de pesquisa, como / usr / local / bin, ou algo assim, e 3) É provavelmente mais seguro ainda chamar o tarprograma estrangeiro gnutar para evitar confundir software esperando que um Mac aja como um Mac. US $ 0,02. -Erik
Erik Bennett
0

Ok, usei a pesquisa do Google, mas os três principais links confirmaram o que eu suspeitava

  1. Erro no seu alcatrão E / OU
  2. Incompatibilidade entre os dois utilitários de alcatrão
    Veja neste link . Alguém relata que "Usar" bsdtar -xvf "funcionou".

Edit: Você está no sistema Mac, pensei o contrário. Você precisará usar o gnutar, ele já deve estar instalado, se não estiver instalado. Claro, você pode olhar para outros links pesquisando a si mesmo.

Sudhi
fonte
0

No MAC OSX instale o gnu-tar

brew install gnu-tar

então crie seu tar compatível com linux com:

gtar -c -f your_tar_file files

Ou você pode criar seu arquivo no formato pax

tar -c --format pax -f your_tar_file files
msadek
fonte