既存のファイルを上書きせずにターゲットディレクトリにtarballを抽出する

既存のファイルを上書きせずにターゲットディレクトリにtarballを抽出する

抽出しようとしています。アーカイブこのような内部構造を持つ(簡素化)

[edit: added toplevel dir]

some_tarball.tar
└── some_tarball/
    ├── bin/
    │   ├── a
    │   └── b
    └── share/
        └── man/
            └── man1/
                ├── a.1.gz
                └── b.1.gz

/binそれをディレクトリにインストールするために/share私はコマンドを使用しましたsudo tar xzf some_tarball.tar --strip-components 1 -C /

ただし、これはコンテンツをマージするのではなく、ディレクトリ全体をそのコンテンツ(つまりインクルード/binaそれ以降のコンテンツ)で上書きします。b内部に制御を無視部分tar manpage的には、既存のファイルを上書きする作業のようです。メタデータdirs、しかしそれは本当ではない。

ここでtarデモと同様の動作を得る方法はありますかrsync?よろしくお願いします!

PS:それが重要であれば、私/shareはシンボリックリンクです/usr/share

答え1

最初にシンボリックリンクだった場合、/bin使用するコマンドはシンボリックリンクを削除し、その場所に新しいディレクトリを作成します。

もっと読む手動(強調):

アーカイブから読み取るとき--dereference-h)オプションを使用すると、tarアーカイブで指定されたファイルを書き込んだり読み取ったりするときに既存のシンボリックリンクに従います。tar通常、tarこれらのリンクはクリックされませんが、新しいファイルを作成する前にリンクが削除されることがあります。。 [… ]

この--dereferenceオプションは安全ではありません[...]

一つの注意ディレクトリもファイルです

あなたはおそらく何が起こったのか、リンクを使用したり削除したりしませんでした--dereference-h

リンクが指すディレクトリはまだどこかに、そのコンテンツは削除されませんでした。しかし、ツールが/bin非常に重要なので、オペレーティングシステムがひざまずくことがあります。この問題を解決するには、元のリンクを再作成する必要があります。新しい/binディレクトリを削除しますln -s target /bin

target残念ながら、リンクのターゲットが何であるかはわかりません。リンクのターゲットが何であるかを推測または把握する必要があります。おそらく /usr/bin

似ている/share

それでもログインしている場合、または再度ログインできる場合は、必要なすべてのツールがどこかにある必要があるため、技術的に変更が必要です。アクセス権を失った場合(たとえば、/bin/bashログインシェルが存在しないためログインできない場合)、ライブ展開を開始してそこから回復するオプションがあります。

関連情報