¿Por qué extraer este tgz arroja un error en mi Mac pero no en Linux?

Estoy experimentando un problema bastante extraño, y no puedo entender qué está pasando. Tengo un file tgz, scip-3.2.0.tgz , que arroja un error cuando bash descomprimirlo. El error solo ocurre en OS X (estoy en 10.10.4). Puedo extraer el file sin error en un cuadro de Linux que ejecuta CentOS 6.6. El error ocurre cuando ambos usan el command de línea de command tar y cuando usan la utilidad de file. Envié un correo electrónico a la list de correo del SCIP, y tengo el mismo hash SHA-1 como 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 recibo cuando trato de descomprimir usando la utilidad de file:

error de utilidad de archivo

En caso de que la image se rompa, el text en la image dice esto:

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

Y cuando bash descomprimir a través de la línea de command, esta es la salida que obtengo . Es la última línea ( tar: Error exit delayed from previous errors. ) Que me preocupa. No veo lo que lo está causando. Parece que el file se extrae sin problemas, pero no confío en que se haya producido ese error.

¿Alguien sabe lo que está causando esto?

[editar]
Mirando un poco más cerca de 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' 

  • Pantalla negra cuando se abre Time Machine en Yosemite
  • ¡Chrome no se cerrará! (Mac Yosemite)
  • El espacio en disco no se libera después de que se eliminan fotos y videos de la aplicación Fotos
  • Automatización del inicio de session en OS X después del reinicio del sistema
  • ¿Cómo mostrar favicon en mi pestaña Safari?
  • ¿Cómo ver notifications cuando se ejecuta a pantalla completa?
  • Ya no puedo permitir que la aplicación controle la computadora
  • Alfnetworking Terminal / Shell Command no funciona
  • 4 Solutions collect form web for “¿Por qué extraer este tgz arroja un error en mi Mac pero no en Linux?”

    Esto debería ayudar a identificar lo que está sucediendo en la respuesta de Johnny , así como responder la pregunta de por qué esto funciona en Linux pero no en Mac.

    El problema radica en el hecho de que Mac OS X usa bsdtar , mientras que la mayoría de los sistemas Linux usan gnutar .

    Puede instalar gnutar en una Mac con Homebrew, usando brew install gnu-tar , que enlazará gnutar en /usr/local/bin como gtar .

    Si instala gnutar , puede reproducir el problema siguiendo los pasos de 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 🍺 /usr/local/Cellar/gnu-tar/1.28: 13 files, 1.6M $ mkdir test $ touch test/a test/b $ gtar -zcvf test.tar.gz test test/a # make the archive with gnutar test/ test/a test/b test/a $ gtar -ztvf test.tar.gz drwxr-xr-x adamliter/staff 0 2015-07-28 22:41 test/ -rw-r--r-- adamliter/staff 0 2015-07-28 22:41 test/a -rw-r--r-- adamliter/staff 0 2015-07-28 22:41 test/b hrw-r--r-- adamliter/staff 0 2015-07-28 22:41 test/a link to test/a $ rm -r test $ tar -xvf test.tar.gz # try to unpack the archive with bsdtar x test/ x test/a x test/b x test/a: Can't create 'test/a' tar: Error exit delayed from previous errors. $ echo $? 1 

    Así que, obviamente, gnutar archiva las cosas de manera diferente, lo que hace que bsdtar con los duplicates. El hecho de que gtar -ztvf test.tar.gz indique que la segunda instancia de test/a se archiva como un link to test/a es relevante. Como Johnny señala en los comentarios, gnutar almacenará los duplicates como enlaces duros en lugar del file real, que se puede desactivar con --hard-dereference .

    Es decir, podrías hacer lo siguiente:

     $ mkdir test $ touch test/a test/b $ gtar -zcvf test.tar.gz test test/a --hard-dereference test/ test/a test/b test/a $ gtar -ztvf test.tar.gz test drwxr-xr-x adamliter/staff 0 2015-07-28 23:49 test/ -rw-r--r-- adamliter/staff 0 2015-07-28 23:49 test/a -rw-r--r-- adamliter/staff 0 2015-07-28 23:49 test/b -rw-r--r-- adamliter/staff 0 2015-07-28 23:49 test/a # note that this is no longer a link $ rm -r test $ tar -xvf test.tar.gz # unpack with bsdtar x test/ x test/a x test/b x test/a $ echo $? 0 $ ls test/ ab 

    Sin embargo, en este caso, obviamente no controlas la creación del tarball, por lo que --hard-dereference no es una opción. Afortunadamente, en function de la respuesta del OP , parece que este problema ha sido solucionado por la cadena de suministro.

    No obstante, si alguien más se encuentra con este problema en el futuro y necesita una solución rápida o si tiene un mantenedor ascendente que no responde, existe una solución alternativa.

    Una vez que identifique el file duplicado, puede usar la --fast-read de bsdtar (tenga en count que esta opción es solo una parte de bsdtar , no de gnutar ):

      -q (--fast-read) (x and t mode only) Extract or list only the first archive entry that matches each pattern or filename operand. Exit as soon as each specified pat- tern or filename has been matched. By default, the archive is always read to the very end, since there can be multiple entries with the same name and, by convention, later entries overwrite earlier entries. This option is provided as a performance optimization. 

    Entonces, en el ejemplo de juguete que he creado siguiendo el ejemplo de juguete en la respuesta de Johnny , el file duplicado es test/a . Por lo tanto, puedes evitar este problema haciendo lo siguiente:

     # this set of commands picks up from the first set of commands # ie, the following assumes a tarball that was *not* made with # the --hard-dereference option, although this will work just as well # with one that was $ tar -xvqf test.tar.gz test/a # unarchive the first instance of test/a x test/a $ tar -xvf test.tar.gz --exclude test/a # unarchive everything except test/a x test/ x test/b $ echo $? 0 $ ls test/ ab 

    Tenga en count, además, que gnutar está encantado de descomprimir un file con duplicates creados por él mismo, incluso cuando no se usó la opción --hard-dereference :

     $ rm -r test $ gtar -xvf test.tar.gz test/ test/a test/b test/a $ echo $? 0 $ ls test/ ab 

    Así que esto responde a su pregunta de por qué se produce un error en Mac pero no en Linux. (La mayoría de las distribuciones de Linux se envían con gnutar , y dado que el package de tarball fue supuestamente empaquetado con gnutar , no habrá ningún error al desempacar con gnutar , pero habrá un error al desempaquetarlo con bsdtar .


    Para lecturas adicionales y references, uno podría querer ver ¿Cuáles son las diferencias entre bsdtar y GNU tar? en Unix.SE.

    La existencia de un file duplicado en el file comprimido no debe invalidarlo o no puede extraerse en OSX, ya que de forma pnetworkingeterminada, tar sobrescribe los duplicates.

    Por lo tanto, estoy un poco confundido por el comportamiento en su Gist – OSX tar permite files duplicates en un file (un retroceso a su propósito original como una herramienta de file t aría, por lo que permite que los files se adjunten al final de el file de cinta, y cuando se restaure el file, la versión más reciente del file sobrescribirá la (s) versión (s) anterior (es))

    Solo cuando la opción "-k" está presente, tar debe advertir sobre files preexistentes.

    Aquí creé un file con un file duplicado y luego lo extraje sin problemas. No fue hasta que agregué la opción -k que me advirtió sobre el file 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 problema simple de umask tampoco parece ser el culpable, intenté cambiar mi umask a 0777 y aún puedo extraer el file:

     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 agregando deliberadamente un directory no escribible al file, pero eso no funcionó, tar no actualizó los permissions en el directory cuando extrajo el file:

     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 traté de cambiar los permissions en la testing / a a 000, anexarla al file y luego agregar otra testing / a, pero esa 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 realmente me gustaría ver el file original que causó el problema y ver qué pudo haber en ese file para causar este problema.

    Si un nombre de file y directory comparten el mismo nombre, tar tiene un problema de extracción, pero tiene un post 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 ocurrió al revés, es decir, un file fue el primero, luego apareció un directory con el mismo nombre, tar lo elimina y crea el directory:

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

    ¡Resulta que la utilidad tar de OS X era la correcta! De hecho, hubo un error en el file. Este hilo de correo electrónico lo analiza con más detalle, pero el problema es que hay un file duplicado en el file . Los chicos de SCIP están arreglando el file mientras escribo esto.

    [editar]
    El recientemente actualizado scip-3.2.0.tgz ahora está extrayendo muy bien! El hash SHA-1 del nuevo tgz es 5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476 .

    [editar 2]
    No es que haya un error en el file. Es simplemente que bsdtar , que se envía con OS X, maneja los files duplicates de forma diferente que gnutar , que se envía con Linux. La respuesta de @Adam Litre aquí proporciona una explicación completa de lo que está sucediendo.

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

    Loving Apple Products like poisoning (iPhone, iPad, iMac, Macbook, iWatch).