Evite erros do tar falhando ao restaurar permissões de diretório

13

Observo o seguinte comportamento com o tar 1.26 e 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

Então, o que estou tentando fazer aqui é extrair um arquivo tar em uma estrutura de diretórios existente, onde não sou o proprietário de todos os diretórios envolvidos, mas tenho permissão de gravação em todos eles. Na verdade, eles são compartilhados entre um grupo.

Não me importo com carimbos de data e hora e acredito que as permissões já devem estar corretas. Estou executando isso como um usuário normal, por isso não deve tentar, a --preserve-permissionsmenos que seja informado, o que eu não fiz. O que realmente me preocupa é o status de saída: pretendo usá-lo em um script e quero saber se a extração real funcionou bem.

Existe uma opção para o tar que diz para não definir permissões de diretório, nem imediatamente nem atrasadas? Na falta disso, que outras soluções você sugeriria. No momento, estou pensando em extrair para um diretório temporário e usar rsyncpara mover coisas para a árvore existente. Mas talvez você conheça uma abordagem menos burra.

MvG
fonte
1
Querendo saber se há uma maneira de fazer isso no momento da criação do alcatrão, em oposição à extração ..?
Roy Truelove 22/03

Respostas:

22

Essa taropção pode ser o que você está procurando:

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

Eu testei da seguinte maneira:

$ 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
fonte
1
Também trabalhei no meu caso, no qual extraí um arquivo tar para um compartilhamento Samba montado. Observe que, diferentemente do comando sugerido, ele também suprime o erro quando o destino está em branco (ou seja, todos os diretórios que causariam erros foram criados pelo próprio tar). Obrigado novamente!
user149408