web-dev-qa-db-ja.com

ディレクトリへのシンボリックリンクを別のターゲットに変更する方法は?

# ln -sv /path/to/target /path/to/link
‘/path/to/link’ -> ‘/path/to/target’

次に、そのターゲットをtarget2に置き換えます。

# ln -sfv /path/to/target2 /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2’

うわあ!そこで何が起こった?末尾のスラッシュはまったく影響しません。

ln -sfv /path/to/target2/ /path/to/link
‘/path/to/link/target2’ -> ‘/path/to/target2/’

# ln -sfv /path/to/target2/ /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2/’

# ln -sfv /path/to/target2 /path/to/link/
‘/path/to/link/target2’ -> ‘/path/to/target2’

達成方法’/path/to/link’ -> ’/path/to/target2’

8
Ars Magika

-n/--no-dereferenceを使用します(「LINK_NAMEがディレクトリへのシンボリックリンクの場合は、通常のファイルとして扱います」)。

$ ln -sv /var/log /tmp/my-link
‘/tmp/my-link’ -> ‘/var/log’
$ ln -sfnv /var/opt /tmp/my-link
‘/tmp/my-link’ -> ‘/var/opt’

つまり、ln -s target linkln -s target link/targetlinkがディレクトリにリンクしている場合のように機能します。

ほとんどのLinuxコマンドツールは、アクションを適用する前にシンボリックリンクを逆参照しようとします。そうでない場合、シンボリックリンクはほとんど混乱し、ほとんど役に立ちません。この場合、元のlnの作者は、一貫性が特定の単純さよりも重要であると考えていたと思います(他のツールに慣れている人々を混乱させるリスクがあります)。

13
l0b0

l0b0の答えは良いものです。それは単純で、ほとんどの場合、コマンドラインでの使用に最適です。ただし、場合によっては、それがアトミックでないことを気にする場合があります。 ln -sf最初に古いシンボリックリンクを削除し、次に新しいシンボリックリンクを作成するため、シンボリックリンクが存在しない短い期間があります。

注意が必要な場合は、一時的な場所に新しいシンボリックリンクを作成し、mvを配置することをお勧めします。

ここにRuby実装があります: http://blog.moertel.com/posts/2005-08-22-how-to-change-symlinks-atomically.html 。どの言語でも実装するのは簡単です。なぜそれがlnのデフォルトの動作ではないのかを理解しました。

2
mc0e