# 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’
?
-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 link
はln -s target link/target
link
がディレクトリにリンクしている場合のように機能します。
ほとんどのLinuxコマンドツールは、アクションを適用する前にシンボリックリンクを逆参照しようとします。そうでない場合、シンボリックリンクはほとんど混乱し、ほとんど役に立ちません。この場合、元のln
の作者は、一貫性が特定の単純さよりも重要であると考えていたと思います(他のツールに慣れている人々を混乱させるリスクがあります)。
l0b0の答えは良いものです。それは単純で、ほとんどの場合、コマンドラインでの使用に最適です。ただし、場合によっては、それがアトミックでないことを気にする場合があります。 ln -sf
最初に古いシンボリックリンクを削除し、次に新しいシンボリックリンクを作成するため、シンボリックリンクが存在しない短い期間があります。
注意が必要な場合は、一時的な場所に新しいシンボリックリンクを作成し、mv
を配置することをお勧めします。
ここにRuby実装があります: http://blog.moertel.com/posts/2005-08-22-how-to-change-symlinks-atomically.html 。どの言語でも実装するのは簡単です。なぜそれがlnのデフォルトの動作ではないのかを理解しました。