Избегайте ошибок из-за того, что 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для перемещения материала в существующее дерево. Но, возможно, вы знаете менее хакерский подход.


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

1
Также работал для моего случая, в котором я распаковал архив tar на смонтированный общий ресурс Samba. Обратите внимание, что в отличие от предложенной команды, она также подавляет ошибку, когда место назначения пустое (т. Е. Все каталоги, которые могут выдавать ошибки, были созданы самим tar). Еще раз спасибо!
user149408
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.