Incompatibilidad de tar de Linux / OS X: las tarballs creadas en OS X dan errores cuando no están clasificadas en Linux

103

Cuando guardo archivos en mi Macbook y los descomprimo en Linux, recibo repetidamente las siguientes advertencias / errores:


 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

Afortunadamente, esto NO afecta a los archivos almacenados en el archivo, que se restauran perfectamente. Sin embargo, causa problemas en varios escenarios, especialmente cuando se trata de procesos de compilación en los que el código de falla distinto de cero devuelto por 'tar' hace que las compilaciones e instalaciones se detengan innecesariamente.

¿Cómo puedo hacer que OS X cree archivos tar que funcionen bien con el resto del mundo Linux?

Además, para los puntos de bonificación, existe un archivo tar distribuido públicamente con estos problemas. ¿Hay alguna forma de hacer que Linux maneje el archivo tar con gracia sin cambiar la forma en que se comprimió originalmente?

Dave Dopson
fuente

Respuestas:

68

Busqué en Google el mensaje de error y parece un problema BSD tar vs GNU tar.

Instalar GNU tarsi es posible en Mac OS y la usará para crear el tar.

Holygeek
fuente
17
Mac OS X 10.6 usa un alquitrán BSD por defecto, pero también viene con un gnutar en /usr/bin/gnutar.
@Ned. Gracias. Esa es buena información.
Dave Dopson el
14
FYI: / usr / bin / gnutar ya no se envía con Mac OS X (al menos a partir de Mavericks)
foobar
sudo port install gnutar cd / usr / bin sudo rm tar sudo ln -s / opt / local / bin / gnutar tar
caosless
Si usa MacPorts, también puede colocar / opt / local / libexec / gnubin / en la parte superior de su RUTA en lugar de eliminar cualquier cosa de / usr / bin o crear enlaces simbólicos manualmente.
Lorrin
58

Si está utilizando Mavericks o una versión más reciente, gnutar ya no se incluye de manera predeterminada.

La solución, si usa homebrew, es ejecutar lo siguiente:

brew install gnu-tar

Luego puede usar el comando gtarpara la compatibilidad de Linux.


Si desea reemplazar tarcon gtar, simplemente reemplace el enlace simbólico

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

Para restaurar el tar original proporcionado con Mac Os X, ejecute los comandos anteriores pero reemplácelos which gtarconwhich bsdtar

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

Spuder
fuente
44
Ya no es necesario desvincularse, como lo indica brew, solo puede agregar esto a su RUTA en .bashrc(o su equivalente):PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
Bryan Petty
1
O simplemente crear un tarvínculo en /usr/local/binpor cd /usr/local/bin ; ln -s gtar tar- posiblemente la opción más simple
Karthik T
26

A GNU tar no le gusta la información opcional que incluye el tar OSX BSD predeterminado.

GNU tar le permitirá suprimir esas advertencias con la opción:

--warning=no-unknown-keyword

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

Tenga en cuenta que el tar de BSD no admite ese indicador, por lo que si necesita ejecutar el mismo código de desempaque en todas las plataformas, puede 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
fuente
55
Esta debería ser la respuesta correcta porque no implica la instalación de una herramienta completamente nueva en aras de suprimir una sola advertencia.
cz
10

Para extraer el archivo tar correctamente sin ningún error en un sistema Linux, puede usar bsdtar.

sudo apt-get install bsdtar

Luego utilícelo como de costumbre.

bsdtar -xvf file.tar¿Dónde file.tarestá el archivo tar que desea extraer?

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

Alternativamente, también puede usar el rodillo de archivos GNOME.

daka
fuente
6
COPYFILE_DISABLE=1 tar cf filename.tar

o

tar --disable-copyfile cf filename.tar

Esta es la característica menos reconocible de tar en OS X que conozco personalmente.

Consulte también ¿Por qué obtengo archivos como ._foo en mi tarball en OS X?


Editar: parece que esto solo podría detener la creación de los ._fooarchivos de tipo no deseado , no detiene la creación del encabezado (al menos en Yosemite / 10.10); gracias comentaristas por señalarlo. Sin embargo, (para los puntos de bonificación :) puedes manejar con gracia tales tarballs extrayéndolos así:

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

Esto funcionó usando gnu tar 1.15.1, ¡que es bastante viejo! Alternativamente, puede usar pax en su lugar, que (para mí) arroja la información adicional en un PaxHeaderdirectorio, pero al menos sale sin error:

pax -rf filename.tar
Zac Thompson
fuente
Lamentablemente, esto no parece detener las advertencias de palabras clave de encabezado extendidas cuando se desmarca con gnutar.
JJC
Ninguno de estos parece funcionar en Yosemite ( tar --versionindica bsdtar 2.8.3 - libarchive 2.8.3). También necesito un guión antes cfen el último caso.
tripleee
4

MacOSX ya viene con gnutar. Si desea una solución rápida y sucia, agregue esto a~/.bash_profile

alias tar='gnutar'

y correr source ~/.bash_profilepara actualizar

Además, OSX se envía con tar GNU y BSD. Entonces también puede desvincular la referencia de tar de bsd a gnu:

sudo unlink /usr/bin/tar;
sudo ln -s /usr/bin/gnutar /usr/bin/tar
Du3
fuente
1
¿Por qué en /etc/hosts? /etc/hostses para el mapeo de host / IP, ¿verdad?
BenjiWiebe
1
lo que dijo @BenjiWiebe. El bit aún más extraño es la edición / etc / hosts. Creo que quisiste decir ~ / .bashrc
Dave Dopson
2
En OS X, .bashrcno se carga para sesiones de Terminal. Necesita .bash_profile, ya que un shell de inicio de sesión se inicia con una nueva ventana de Terminal. / cc @BenjiWiebe
slhck
Correcto :-) También estaba trabajando en / etc / hosts en ese momento, por lo que vomitó en el teclado. Buena captura
Du3
2

Gracias. Este hilo fue muy útil. Si está utilizando MacPorts aquí hay un tutorial rápido:

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

Agregue la siguiente línea a /Users/[yournamefont>/.profile

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

Salga y reinicie su ventana de Terminal.

howdytom
fuente
1

Sí, el binario de tar incorporado de Mac agrega un montón de cosas adicionales que a CentOS no le gustan. Para solucionar esto, haga lo siguiente:

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

¡Espero que ayude!

Shaheen Ghiassy
fuente
Esa es una forma. Resolví el problema de GNU / BSD de manera más completa en github.com/ddopson/dotfiles . Tengo ~ / bin / coreutils al principio del camino y hay pequeñas cuñas allí como github.com/ddopson/dotfiles/blob/master/bin/coreutils/tar que seleccionan el ejecutable correcto basado en Linux vs Mac y si el entorno COREUTILS variable está configurada
Dave Dopson
Es posible que desee modificar sus instrucciones para decirle a la gente que verifique la existencia de / usr / bin / gnutar antes de mover su alquitrán de trabajo. Los novatos pueden encontrar esto usando google y no saben cómo deshacer su sistema.
msouth
Probablemente no sea una buena idea, por un par de razones. 1) Ahora los paquetes de Apple no saben dónde encontrar el alquitrán nativo, el alquitrán que sabe cómo manejar los atributos del archivo de Apple. 2) Si debe usar GNU tar, el lugar adecuado para colocarlo está adelante en su ruta de búsqueda, como / usr / local / bin, o algo así, y 3) Probablemente sea más seguro llamar al tarprograma extranjero gnutar para evitar software confuso esperando que una Mac actúe como una Mac. $ 0.02. -Erik
Erik Bennett
0

Bien, utilicé la búsqueda de Google, pero los tres enlaces principales confirmaron lo que sospechaba

  1. Error en su alquitrán Y / O
  2. Incompatibilidad entre las dos utilidades tar
    Ver este enlace . Allí alguien informa que "Usar" bsdtar -xvf "funcionó".

Editar: Estás en el sistema Mac, pensé al revés. Necesitará usar gnutar, ya debe estar instalado, si no lo tiene instalado. Por supuesto, puede mirar otros enlaces buscándose usted mismo.

Sudhi
fuente
0

En MAC OSX instale gnu-tar

brew install gnu-tar

luego cree su tar compatible con Linux con:

gtar -c -f your_tar_file files

O puede crear su archivo con formato pax

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