Evite errores de tar que no puedan restaurar los permisos del directorio

13

Observo el siguiente comportamiento con tar 1.26 y 1.27.1:

$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b -xvf test.tar diffowner
diffowner/
diffowner/foo
tar: diffowner: Cannot utime: Operation not permitted
tar: diffowner: Cannot change mode to rwxr-xr-x: Operation not permitted
tar: Exiting with failure status due to previous errors

Entonces, lo que estoy tratando de hacer aquí es extraer un archivo tar en una estructura de directorio existente, donde no soy el propietario de todos los directorios involucrados pero sí tengo permiso de escritura en todos ellos. De hecho, se comparten entre un grupo.

No me importan las marcas de tiempo, y confío en que los permisos ya deberían ser correctos. Estoy ejecutando esto como un usuario normal, por lo que no debería intentarlo a --preserve-permissionsmenos que se lo indiquen, lo que no hice. Lo que realmente me preocupa es el estado de salida: tengo la intención de usar esto en un script y quiero saber si la extracción real funcionó bien.

¿Hay una opción para tar que le dice que no establezca permisos de directorio, ni de inmediato ni retrasado? De lo contrario, ¿qué otras soluciones sugeriría? En este momento estoy pensando en extraer a un directorio temporal y usarlo rsyncpara mover cosas al árbol existente. Pero quizás conoces un enfoque menos hack.

MvG
fuente
1
¿Se pregunta si hay una manera de hacer esto en el momento de la creación de alquitrán en lugar de la extracción ...?
Roy Truelove

Respuestas:

22

Esta taropción puede ser lo que estás buscando:

 --no-overwrite-dir
       preserve metadata of existing directories

Probé de la siguiente manera:

$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b --no-overwrite-dir -xvf test.tar diffowner
diffowner/
diffowner/foo
$ echo $?
0
terdon
fuente
1
También funcionó para mi caso, en el que extraje un archivo tar a un recurso compartido Samba montado. Tenga en cuenta que, a diferencia de lo que sugiere el comando, también suprime el error cuando el destino está en blanco (es decir, todos los directorios que darían errores fueron creados por el propio tar). ¡Gracias de nuevo!
user149408