31 votos

¿Por qué la extracción de este tgz da un error en mi Mac pero no en Linux?

Estoy experimentando un problema bastante extraño, y no puedo averiguar qué está pasando. Tengo un archivo tgz, scip-3.2.0.tgz que arroja un error cuando intento desempaquetarlo. El error sólo se produce en OS X (estoy en 10.10.4). Puedo extraer el archivo sin error en un equipo Linux con CentOS 6.6. El error se produce cuando ambos utilizando la línea de comandos tar y al utilizar la utilidad de archivo. Envié un correo electrónico a la lista de correo SCIP, y tengo el mismo hash SHA-1 que otro usuario ( e085a4a3591eddf945dcb365d97d2512c267e374 ), por lo que no hubo un error de descarga. No están seguros de lo que está pasando.

Este es el error que obtengo cuando intento desempaquetar utilizando la utilidad de archivo:

archive utility error

En caso de que la imagen se rompa alguna vez, el texto de la imagen dice esto:

No se puede expandir "scip-3.2.0.tgz" en el "Escritorio".
(Error 1 - Operación no permitida).

Y cuando intento desempaquetar a través de la línea de comandos, este es el resultado que obtengo . Es la última línea ( tar: Error exit delayed from previous errors. ) que me preocupa. No veo cuál es la causa. El archivo aparece para extraer sin problema, pero no me fío de que se lance ese error.

¿Alguien sabe cuál es la causa de esto?

[editar]
Mirando un poco más de cerca la salida, la línea 1108 contiene el error:

x scip-3.2.0/applications/Coloring/Makefile: Can't create 'scip-3.2.0/applications/Coloring/Makefile'

2 votos

¿Funciona con otra aplicación como el unarchiver? wakaba.c3.cx/s/apps/unarchiver.html

0 votos

Sí, así es. Me pregunto qué es lo que hacen diferente. Parte del problema es que tengo un bash script que está automatizando un montón de cosas, y una de las cosas que necesita hacer es extraer este tgz para poder construir lo que hay dentro de él. Me pregunto si hay un error en el tar que viene con OS X.

1 votos

Es muy posible que haya un error. He descubierto que la utilidad de archivo integrada en OS X es bastante mala. ¿No hay forma de volver a archivar los archivos necesarios en un zip o algo así? Además, si estás haciendo un script, ¿el error también se produce cuando gunzip -c scip-3.2.0.tgz | tar xopf - desde la línea de comandos, tal y como lo usarías para tu script?

41voto

Adam Liter Puntos 314

Esto debería ayudar a identificar lo que está pasando en La respuesta de Johnny Además de responder a la pregunta de por qué esto funciona en Linux pero no en Mac.

El problema radica en que Mac OS X utiliza bsdtar mientras que la mayoría de los sistemas Linux utilizan gnutar .

Puede instalar gnutar en un Mac con Homebrew, utilizando brew install gnu-tar , que hará un enlace simbólico gnutar en /usr/local/bin como gtar .

Si instalas gnutar entonces puede reproducir el problema utilizando los pasos en La respuesta de Johnny .

$ brew install gnu-tar
==> Downloading https://homebrew.bintray.com/bottles/gnu-tar-1.28.yosemite.bottle.2.tar.gz
######################################################################## 100.0%
==> Pouring gnu-tar-1.28.yosemite.bottle.2.tar.gz
==> Caveats
gnu-tar has been installed as "gtar".

If you really need to use it as "tar", you can add a "gnubin" directory
to your PATH from your bashrc like:

    PATH="/usr/local/opt/gnu-tar/libexec/gnubin:$PATH"
==> Summary

0 votos

Vaya, buena investigación, no tenía ni idea de que hubiera una diferencia significativa entre gnutar y bsd tar. Basado en su gtar -tcvf gnutar es lo suficientemente "inteligente" como para optimizar la segunda copia del archivo como un enlace en lugar de duplicarlo en el archivo.

0 votos

Después de buscar en la documentación, parece que esto es un efecto secundario del manejo de enlaces duros de gtar. Parece que piensa que el archivo duplicado es en realidad un enlace duro al archivo, por lo que lo almacena como un enlace en lugar del archivo real. Dando a gtar el --hard-dereference desactiva este comportamiento.

0 votos

@Johnny En realidad fueron dos de los mantenedores de Homebrew los que se dieron cuenta de esto (Misty De Meo y Dominyk Tiller). Un mantenedor de un software que utilizo lanzó una nueva versión con un archivo duplicado en el tarball, lo que causó problemas al intentar instalar la nueva versión con Homebrew (obviamente). De todos modos, ¡gracias por revisar los documentos! Lo añadiré a la respuesta.

8voto

Johnny Puntos 177

La existencia de un archivo duplicado en el archivo no debería hacerlo inválido o incapaz de ser extraído en OSX, ya que por defecto, tar sobrescribe los duplicados.

Por lo tanto, estoy un poco confundido por el comportamiento en su Gist - OSX tar permite que los archivos duplicados en un archivo (un retroceso a su propósito original como un t ape ar cebollino por lo que permite añadir archivos al final del archivo de cinta, y cuando se restaura el archivo la versión más reciente del archivo sobrescribirá la(s) versión(es) más antigua(s)))

Sólo cuando la opción "-k" está presente, tar debe advertir sobre los archivos preexistentes.

Aquí he creado un archivo con un duplicado y lo he extraído sin problemas. No fue hasta que añadí la opción -k que me advirtió sobre el archivo duplicado:

Macbook> tar --version
bsdtar 2.8.3 - libarchive 2.8.3
Macbook> mkdir test
Macbook> touch test/a test/b
Macbook> tar -zcvf test.tar.gz test test/a
a test
a test/a
a test/b
a test/a
Macbook> tar -ztvf test.tar.gz
drwxr-xr-x  0 user group       0 Jul 28 10:42 test/
-rw-r--r--  0 user group       0 Jul 28 10:42 test/a
-rw-r--r--  0 user group       0 Jul 28 10:42 test/b
-rw-r--r--  0 user group       0 Jul 28 10:42 test/a
Macbook> rm -r test
Macbook> tar -xvf test.tar.gz
x test/
x test/a
x test/b
x test/a
Macbook> echo $?
0
Macbook> rm -r test
Macbook> tar -k -xvf test.tar.gz
x test/
x test/a
x test/b
x test/a: Already exists
tar: Error exit delayed from previous errors.
Macbook> echo $?
1

Un simple problema de umask tampoco parece ser el culpable, he probado a cambiar mi umask a 0777 y todavía puedo extraer el archivo:

Macbook> tar -xvf test.tar
x test/
x test/a
x test/b
x test/a
Macbook> ls -l test
ls: test: Permission denied
Macbook> sudo ls -l test
total 0
----------  1 someuser  wheel  0 Jul 28 13:48 a
----------  1 someuser  wheel  0 Jul 28 13:48 b

Pensé que podría duplicar el problema añadiendo deliberadamente un directorio no escribible al archivo, pero eso no funcionó, tar no actualizó los permisos del directorio cuando extrajo el archivo:

Macbook> mkdir -p testdir1/test testdir2/test
Macbook> touch testdir1/test/{a,b} testdir2/test/a
Macbook> chmod -w testdir2/test
Macbook> touch testdir2/test/b
touch: testdir2/test/b: Permission denied
Macbook> find testdir* -ls  | awk '{print $3, $11}'
drwxrwx--- testdir1
drwxrwx--- testdir1/test
-rw-rw---- testdir1/test/a
-rw-rw---- testdir1/test/b
drwxrwx--- testdir2
dr-xr-x--- testdir2/test
-rw-rw---- testdir2/test/a
Macbook> cd testdir1
Macbook> tar -cvf ../test.tar test/*
a test/a
a test/b
Macbook> cd ../testdir2
Macbook> tar -rvf ../test.tar test
a test
a test/a
Macbook> cd ..
Macbook> tar -tvf ./test.tar
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/b
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
dr-xr-x---  0 username groupname       0 Jul 28 15:40 test/
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
Macbook> tar -xvf test.tar
x test/a
x test/b
x test/a
x test/
x test/a
Macbook> 

También probé a cambiar los permisos de test/a a 000, añadirlo al archivo y luego añadir otro test/a, pero ese también funcionó bien:

drwxrwx---  0 username groupname       0 Jul 28 15:40 test/
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/b
dr-xr-x---  0 username groupname       0 Jul 28 15:40 test/
----------  0 username groupname       0 Jul 28 15:40 test/a
-rw-rw----  0 username groupname       0 Jul 28 15:40 test/a

Así que me gustaría ver el archivo original que causó el problema y ver qué pudo haber en ese archivo para causar este problema.

Si un nombre de archivo y un directorio comparten el mismo nombre, tar tiene un problema de extracción, pero tiene un mensaje de error bastante claro:

Macbook> tar -xvf test.tar
x test/
x test/dir1/
x test/dir1/a
x test/
x test/dir1: Can't remove already-existing dir
tar: Error exit delayed from previous errors.

(si el conflicto se produjo al revés, es decir, un archivo llegó primero y luego un directorio con el mismo nombre, tar simplemente lo elimina y crea el directorio:

Macbook> tar -xvf test.tar
x test/
x test/dir1
x test/
x test/dir1/
x test/dir1/a

0 votos

Hola Johnny, esto no parece responder a la pregunta. ¿Cuál es la solución que propones a la pregunta? Si pudieras editar tu respuesta para exponer un paso a paso detallado, sería estupendo. De lo contrario, esto podría ser mejor como un comentario en otra respuesta proporcionada como información contextual.

1 votos

Dejé un poco más claro que el comportamiento en su Gist (y su auto-respuesta) no parece ser la respuesta completa porque los duplicados de archivos están permitidos en un archivo tar. Así que la respuesta a "No puedo desempaquetar un archivo tar con un archivo duplicado" no debería ser "Eliminar el archivo duplicado" ya que se supone que tar es capaz de manejar ese caso.

0 votos

Johnny - entendido, y aprecio el contexto dado en la situación. Dado que parece más un método de reproducción de problemas en lugar de una solución, todavía estoy adivinando que podría ser mejor como un comentario a la auto-respuesta en lugar de una respuesta por sí misma - mientras que es útil, todavía no intenta resolver el problema más allá de explicar que el problema es sólo un duplicado (por ejemplo, no hay pasos de remediación incluidos para abordar cómo el usuario podría trabajar alrededor del problema, etc). Sin embargo, el detalle es excelente.

7voto

Geoff Puntos 225

Resulta que la utilidad tar de OS X era la correcta. Efectivamente, había un error en el archivo. Este hilo de correo electrónico lo discute con más detalle, pero el problema es que hay un duplicado en el archivo . Los chicos de SCIP están arreglando el archivo mientras escribo esto.

[editar]
El nuevo scip-3.2.0.tgz actualizado se extrae sin problemas. El hash SHA-1 del nuevo tgz es 5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476 .

[editar 2]
No es que haya un error en el archivo. Es simplemente que bsdtar que viene con OS X, maneja los archivos duplicados de manera diferente que gnutar que viene con Linux. Respuesta de @Adam Liter aquí ofrece una explicación exhaustiva de lo que ocurre.

1 votos

Interesante. ¿Así que tal vez las otras utilidades ignoraban el error de archivo duplicado y seguían adelante sin quejarse? De todos modos, me alegro de que hayas encontrado la causa y la respuesta.

1 votos

Sí, creo que eso es exactamente lo que están haciendo los otros servicios públicos. Yo diría que la utilidad tar de OS X es la correcta aquí. Un archivo malformado siempre debería levantar al menos una advertencia para alertar al usuario de que algo está mal. Gracias por tu ayuda.

0 votos

Un archivo duplicado en un archivo tar no lo convierte en un archivo malformado, el formato tar permite específicamente los duplicados. Tengo curiosidad por saber por qué el tar de su mac se negó a descomprimir el archivo a pesar de que no especificó el -k que haría que se advirtiera sobre los archivos preexistentes. Desgraciadamente, ya han actualizado el scip-3.2.0.tgz para eliminar el duplicado, así que no puedo probar ese archivo.

2voto

Hay un software de archivo alternativo, gratuito y ligero que utilizo para Mac OSX. Se llama Keka y lo uso para descomprimir 7zip más específicamente. Además, puede descomprimir otros tipos como .rar, .tar, .gz, etc. También funcionó para el archivo tar específico del OP, pero lo intenté después de que @Geoff mencionara que el equipo estaba trabajando en la reparación del archivo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X