Estoy experimentando un problema bastante extraño, y no puedo entender qué está pasando. Tengo un archivo tgz, scip-3.2.0.tgz , que arroja un error cuando intento descomprimirlo. El error solo ocurre en OS X (estoy en 10.10.4). Puedo extraer el archivo sin error en una caja de Linux que ejecuta CentOS 6.6. El error ocurre cuando se usa el comando de línea de tar
comando y cuando se usa 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.
Aquí está el error que obtengo cuando intento descomprimir usando la utilidad de archivo:
En caso de que la imagen alguna vez se rompa, el texto en la imagen dice esto:
No se puede expandir "scip-3.2.0.tgz" en "Escritorio".
(Error 1 - Operación no permitida).
Y cuando trato de descomprimir a través de la línea de comando, este es el resultado que obtengo . Es la última línea ( tar: Error exit delayed from previous errors.
) lo que me preocupa. No veo lo que lo está causando. El archivo parece extraerse sin problema, pero no confío en que se arroje ese error.
¿Alguien sabe qué está causando esto?
[edit]
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'
tar
comando que viene con OS X.gunzip -c scip-3.2.0.tgz | tar xopf -
sale de la línea de comandos, ya que lo usaría para su secuencia de comandos?gunzip
funciona bien, pero cuando trato de extraer el tarball sin comprimir, es cuando se produce el error.Respuestas:
Esto debería ayudar a identificar lo que está sucediendo en la respuesta de Johnny , así como a 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 usangnutar
.Se puede instalar
gnutar
en un Mac con Homebrew, utilizandobrew install gnu-tar
, lo que enlazar simbólicamentegnutar
en/usr/local/bin
tangtar
.Si lo instala
gnutar
, puede reproducir el problema siguiendo los pasos de la respuesta de Johnny .Por lo tanto, obviamente
gnutar
archiva las cosas de manera diferente, lo que hacebsdtar
que se ahogue con los duplicados. El hecho de quegtar -ztvf test.tar.gz
la segunda instancia detest/a
se archiva como alink to test/a
es relevante. Como señala Johnny en los comentarios,gnutar
almacenará duplicados como enlaces duros en lugar del archivo real, que se puede desactivar con--hard-dereference
.Es decir, puede hacer lo siguiente:
Sin embargo, en este caso, obviamente no controlas la creación del tarball, por
--hard-dereference
lo que no es una opción. Afortunadamente, según la respuesta del OP , parece que este problema se ha solucionado en sentido ascendente.No obstante, si alguien más se encuentra con este problema en el futuro y necesita una solución rápida o tiene un mantenedor ascendente que no responde, hay una solución alternativa.
Una vez que identifique cuál es el archivo duplicado, puede usar la
--fast-read
opción debsdtar
(tenga en cuenta que esta opción es solo parte debsdtar
, nognutar
):Entonces, en el ejemplo de juguete que he creado siguiendo el ejemplo de juguete en la respuesta de Johnny , el archivo duplicado es
test/a
. Por lo tanto, puede evitar este problema haciendo lo siguiente:Tenga en cuenta, además, que
gnutar
está perfectamente feliz de descomprimir un archivo con duplicados que fue creado por sí mismo, incluso cuando la--hard-dereference
opción no se utilizó:Entonces 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 tarball fue presumiblemente empaquetadognutar
, no habrá ningún error al desempacargnutar
, pero habrá un error al desempacar conbsdtar
.Para una lectura y referencia adicional, uno puede mirar ¿Cuáles son las diferencias entre bsdtar y GNU tar? en Unix.SE.
fuente
gtar -tcvf
, gnutar es lo suficientemente "inteligente" como para optimizar el segundo archivo de copia como un enlace en lugar de duplicarlo en el archivo.--hard-dereference
opción deshabilita este comportamiento.La existencia de un archivo duplicado en el archivo no debe invalidarlo o no se puede extraer en OSX, ya que, de forma predeterminada, 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 (una vuelta a su propósito original como t mono ar cebolleta utilidad, por lo que permite que los archivos que se añaden al final de el archivo de cinta, y cuando se restaura el archivo, la versión más reciente del archivo sobrescribirá las versiones anteriores)
Solo cuando la opción "-k" está presente, tar debe advertir sobre los archivos preexistentes.
Aquí creé un archivo con un archivo duplicado y luego lo extraje sin problemas. No fue hasta que agregué la opción -k que me advirtió sobre el archivo duplicado:
Un simple problema de umask tampoco parece ser el culpable, intenté cambiar mi umask a 0777 y aún puedo extraer el archivo:
Pensé que podría duplicar el problema agregando deliberadamente un directorio no grabable al archivo, pero eso no funcionó, tar no actualizó los permisos en el directorio cuando extrajo el archivo:
También intenté cambiar los permisos en la prueba / a a 000, agregarlo al archivo y luego agregar otra prueba / a, pero esa también funcionó bien:
Así que realmente me gustaría ver el archivo original que causó el problema y ver qué podría haber estado en ese archivo para causar este problema.
Si un nombre de archivo y un directorio comparten el mismo nombre, tar tiene un problema para extraerlo, pero tiene un mensaje de error bastante claro:
(si el conflicto ocurrió al revés, es decir, primero vino un archivo, luego vino un directorio con el mismo nombre, tar simplemente lo elimina y crea el directorio:
fuente
¡Resulta que la utilidad tar de OS X era la correcta! De hecho, hubo un error en el archivo. Este hilo de correo electrónico lo analiza con más detalle, pero el problema es que hay un archivo duplicado en el archivo . Los chicos de SCIP están arreglando el archivo mientras escribo esto.
[editar] ¡
El scip-3.2.0.tgz recientemente actualizado se está extrayendo perfectamente! El hash SHA-1 del nuevo tgz es
5b4e8283f4a5bf9e50f9a62d4320d6f5f50c8476
.[editar 2]
No es que haya un error en el archivo. Es simplemente eso
bsdtar
, que se envía con OS X, maneja los archivos duplicados de manera diferente quegnutar
, que se envía con Linux. La respuesta de @Adam Liter aquí proporciona una explicación detallada de lo que está sucediendo.fuente
-k
opción, lo que lo advertiría sobre archivos preexistentes. Desafortunadamente, ya han actualizado elscip-3.2.0.tgz
archivo para eliminar el engaño, por lo que no puedo probar ese archivo.tar
extracto reacciona de manera diferente al tratar de extraerscip-3.2.0/applications/Coloring/Makefile
dos veces dependiendo de suumask
. Si el primero creado no te deja un acceso de escritura, el segundo intento falla.Hay un software de archivo alternativo, gratuito y liviano que uso 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. Funcionó también 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.
fuente