Évitez les erreurs de tar qui ne parviennent pas à restaurer les autorisations de répertoire

13

J'observe le comportement suivant avec tar 1.26 et 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

Donc, ce que j'essaie de faire ici, c'est d'extraire un fichier tar dans une structure de répertoires existante, où je ne suis pas le propriétaire de tous les répertoires impliqués mais j'ai une autorisation d'écriture sur chacun d'eux. En fait, ils sont partagés au sein d'un groupe.

Je ne me soucie pas des horodatages et j'espère que les autorisations doivent déjà être correctes. J'exécute cela en tant qu'utilisateur normal, il ne devrait donc pas essayer, --preserve-permissionssauf indication contraire, ce que je n'ai pas fait. Ce qui m'inquiète vraiment, c'est le statut de sortie: j'ai l'intention de l'utiliser dans un script et je veux savoir si l'extraction réelle a bien fonctionné.

Y a-t-il une option pour tar qui lui dit de ne pas définir les autorisations de répertoire, ni immédiatement ni retardées? A défaut, quelles autres solutions proposeriez-vous? En ce moment, je pense à extraire dans un répertoire temporaire et à utiliser rsyncpour déplacer des éléments dans l'arborescence existante. Mais vous connaissez peut-être une approche moins hackeuse.

MvG
la source
1
Vous vous demandez s'il existe un moyen de le faire au moment de la création du goudron par opposition à l'extraction ..?
Roy Truelove

Réponses:

22

Cette taroption pourrait être ce que vous recherchez:

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

J'ai testé comme suit:

$ 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
la source
1
A également fonctionné pour mon cas, dans lequel j'ai extrait une archive tar vers un partage Samba monté. Notez que contrairement à la commande suggérée, elle supprime également l'erreur lorsque la destination est vide (c'est-à-dire que tous les répertoires qui donneraient des erreurs ont été créés par tar lui-même). Merci encore!
user149408