Unikaj błędów powodowanych przez tar, które nie przywracają uprawnień do katalogu

13

Obserwuję następujące zachowanie zarówno dla tar 1.26, jak i 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

Więc próbuję tutaj wyodrębnić plik tar do istniejącej struktury katalogów, w której nie jestem właścicielem wszystkich zaangażowanych katalogów, ale mam uprawnienia do zapisu na wszystkich z nich. W rzeczywistości są one wspólne dla grupy.

Nie dbam o znaczniki czasu i ufam, że uprawnienia powinny już być poprawne. Używam tego jako zwykłego użytkownika, więc nie powinno się tego próbować, --preserve-permissionschyba że powiedziano mi to, czego nie zrobiłem. To, co naprawdę mnie martwi, to status wyjścia: zamierzam użyć tego w skrypcie i chcę wiedzieć, czy faktyczna ekstrakcja działała dobrze.

Czy istnieje opcja tar, która mówi, aby nie ustawiać uprawnień do katalogu, ani natychmiast, ani z opóźnieniem? W przeciwnym razie, jakie inne rozwiązania byś zaproponował. Teraz myślę o rozpakowaniu do katalogu tymczasowego i użyciu rsyncdo przeniesienia rzeczy do istniejącego drzewa. Ale może znasz mniej hackerskie podejście.

MvG
źródło
1
Zastanawiasz się, czy istnieje sposób, aby to zrobić w czasie tworzenia tar, a nie ekstrakcja ..?
Roy Truelove

Odpowiedzi:

22

Ta taropcja może być tym, czego szukasz:

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

Testowałem w następujący sposób:

$ 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
źródło
1
Działa również w moim przypadku, w którym rozpakowałem archiwum tar do zamontowanego udziału Samby. Zauważ, że inaczej niż sugeruje to polecenie, pomija również błąd, gdy miejsce docelowe jest puste (tzn. Wszystkie katalogi, które dawałyby błędy, zostały utworzone przez samą tar). Dzięki jeszcze raz!
user149408,