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
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?0 votos
Sí, ese comando arroja el mismo error.
gunzip
funciona bien, pero cuando intento extraer el tarball descomprimido, es cuando se produce el error.0 votos
Ah, ¡resulta que efectivamente había un error en el tarball! No estoy loco. Escribiré una respuesta más detallada. ¡Aparentemente la utilidad tar en OS X era la correcta aquí!
0 votos
¿Cuál es su
umask
en los 2 sistemas en los que ha ejecutado estetar
?0 votos
En mi Mac,
umask
es 0022. En la máquina Linux, es 0002.