抽出しようとしています。アーカイブこのような内部構造を持つ(簡素化)
[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 /
。
ただし、これはコンテンツをマージするのではなく、ディレクトリ全体をそのコンテンツ(つまりインクルード/bin
とa
それ以降のコンテンツ)で上書きします。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
ログインシェルが存在しないためログインできない場合)、ライブ展開を開始してそこから回復するオプションがあります。