Избегайте ошибок из-за того, что tar не может восстановить разрешения каталога

13

Я наблюдаю следующее поведение с tar 1.26 и 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

Поэтому я пытаюсь извлечь tar-файл из существующей структуры каталогов, где я не являюсь владельцем всех задействованных каталогов, но у меня есть разрешение на запись для всех из них. На самом деле они разделены между группой.

Меня не волнуют метки времени, и я верю, что разрешения уже должны быть правильными. Я запускаю это как обычный пользователь, так что не стоит пытаться, --preserve-permissionsесли не сказано, что я не сделал. Что действительно беспокоит меня, так это состояние выхода: я собираюсь использовать это в сценарии и хочу знать, сработало ли фактическое извлечение.

Есть ли опция для tar, которая говорит, что она не должна устанавливать права доступа к каталогам, ни немедленно, ни с задержкой? В противном случае, какие другие решения вы бы предложили. Прямо сейчас я думаю об извлечении во временный каталог и использовании rsyncдля перемещения материала в существующее дерево. Но, возможно, вы знаете менее хакерский подход.

MVG
источник
1
Хотите знать, есть ли способ сделать это во время создания смолы, в отличие от извлечения ..?
Рой Truelove

Ответы:

22

Этот tarвариант может быть тем, что вы ищете:

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

Я проверил следующим образом:

$ 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
источник
1
Также работал для моего случая, в котором я распаковал архив tar на смонтированный общий ресурс Samba. Обратите внимание, что в отличие от предложенной команды, она также подавляет ошибку, когда место назначения пустое (т. Е. Все каталоги, которые могут выдавать ошибки, были созданы самим tar). Еще раз спасибо!
user149408