web-dev-qa-db-ja.com

ディレクトリのシンボリックリンクを上書きする方法

foo1foo2の2つのディレクトリがあります。

まず、ln -s foo1 barでディレクトリシンボリックリンクを作成します。その後、シンボリックリンクを変更したいので、ln -sf foo2 barと入力しました

ただし、barfoo1とリンクしています。 Symlink foo2foo1内に作成されます。

foo1foo2に置き換えるには、何を入力すればよいですか?

3つの環境でテストしました。

  1. Ubuntu 12.04、ln(GNU coreutils)8.13
  2. CentOS 6.4、ln(GNU coreutils)8.4
  3. OS X 10.7.5、ln(バージョンなし)
15
ironsand

これを行う適切な方法は、そのような-n, --no-dereferenceオプションを使用することです。

$ ln -snf foo2 bar

これにより、lnは既存のシンボリックリンクをファイルとして扱います。それ以外の場合は、barfoo1に逆参照し、foo1に降りて、元のTARGET名をLINK_NAMEとして使用します。そのため、 foo2ディレクトリ内に作成されるfoo1へのシンボリックリンク。 lnのマンページには、次のように記載されています...

-n、--no-dereference 
 LINK_NAMEが
ディレクトリへのシンボリックリンクである場合、それを通常のファイルとして扱います

以下は、--no-dereferenceオプションを使用した場合と使用しない場合のバージョン8.21のlnを使用したArch Linuxデスクトップのシェル出力です。--no-dereferenceオプションを使用しない場合と同じ結果が得られましたが、 --no-dereferenceオプションは期待どおりに機能しました。

$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
  total 0
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2
18
Drew Chapin