web-dev-qa-db-ja.com

シンボリックリンクを上書き/更新する方法は?

シンボリックリンクを使用しようとしています。私はいくつか読んで、次のコマンドを見つけました:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

作成と削除は正常に機能します。しかし、更新は機能しません。このコマンドを実行すると、シンボリックリンクは無効になります。

シンボリックリンクを更新/上書きすることは不可能であることをあちこちで読んだことがあります。だからネットには相反する情報があります。誰が正しいのですか?シンボリックリンクを更新/上書きできる場合、どうすればこれを達成できますか?

更新

これが私のディレクトリ構造です:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

~/scripts/test/、私が実行するとき:

ln -s /remote_loc/site1 test_link

test_linkが作成され、私はls -lそれでも、壊れているようです(上記の質問で私が言ったこととは対照的です)。

複数のディレクトリレベルのリンクを実行するにはどうすればよいですか?

200

わかりました、私のエラーの場所を見つけました:最初の/パス内。

つまり、私の質問のコマンドは次のようになります。

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

の代わりに

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

私のケースを考慮して。

130

-flnと一緒に使用すると、すでに存在するリンクが上書きされるため、適切な権限がある限り、リンクは機能します...常に機能します。どのオペレーティングシステムを使用していますか?

163
Sirch

最初の問題:

あなたを引用:

作成と削除は正常に機能します。しかし、更新は機能しません。このコマンドを実行すると、シンボリックリンクは無効になります。

指定されたディレクトリ構造の問題:

〜/ scripts/test /〜/ scripts/test/remote_loc /〜/ scripts/test/remote_loc/site1 /〜/ scripts/test/remote_loc/site1/stuff1.txt〜/ scripts/test/remote_loc/site2 /〜/ scripts /test/remote_loc/site2/stuff2.txt〜/ scripts/test/remote_loc/site2 /〜/ scripts/test/remote_loc/site3/stuff3.txt

次のコマンドを使用します:

ln -s /remote_loc/site1 test_link

$ PWDまたは現在の作業ディレクトリに、/ remote_loc/site1の/またはルートの存在しないファイルを指すシンボリックリンクを作成することですか。

PWDが〜/ scripts /にある場合、これを使用する必要がありました。

ln -s remote_loc/site1 test_link

それ以外の場合は、次のような完全な絶対パスを使用できます。

ln -s /home/yourusername/remote_loc/site1 test_link

2番目の問題:

あなたを引用:

シンボリックリンクを更新/上書きすることはできないことを、あちこちで読みました。だからネットには相反する情報があります。誰が正しいのですか?シンボリックリンクを更新/上書きできる場合、どうすればこれを達成できますか?

「だれが正しいのか」という質問に答えるために、あなたが正確に何を読んだか、それがどのように理解されたかはわかりません。ただし、次の方法で解決する必要があります。

  1. 更新できるもの、および
  2. 適切なスイッチを使用しないと更新できないもの。


ディレクトリではないターゲットを持つシンボリックリンクを更新しています。

ln -sf:
-fまたは--force既存の宛先ファイルを削除します。これは、リンクのターゲットまたは宛先を更新するために使用されます。

例:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

しかし、ご覧のとおり、lnの引数に絶対パスが含まれている場合は、絶対パスが表示されます。現在の作業ディレクトリがリンクの親ディレクトリと異なる場合は、フルパスを指定する必要があります。


相対パス:

ln -sfr:
-rまたは--relativeは、リンクの場所を基準にしてシンボリックリンクを作成します。

例:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

ただし、ターゲットがディレクトリの場合、ディレクトリへのリンクの更新は機能しません。

例:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

ご覧のとおり、上記のlnの引数で指定された絶対パス名を-rオプションなしで使用しているにもかかわらず、シンボリックリンクはリンクに対して相対的です。


ディレクトリへのリンクを更新:

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

例:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

対照的に:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir
13
Keith Reynolds
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2
7
jirib