ディレクトリのアクセス許可の復元に失敗した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
抽出ではなくtar作成時にこれを行う方法があるかどうか疑問に思います。
ロイ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
また、マウントされたSamba共有にtarアーカイブを抽出した私のケースでも機能しました。コマンドが示唆するのとは異なり、宛先が空白の場合もエラーを抑制します(つまり、エラーを与えるすべてのディレクトリがtar自体によって作成された)。再度、感謝します!
user149408
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.