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


188

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

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

a test_linkが作成され、私はls -lそれをすることができますが、壊れているようです(私の質問で上で言ったこととは反対です)。

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


1
unlink代わりに使用することをお勧めしますrm。ではunlink、あなた間違ったスイッチを使用して、ソースディレクトリ内のファイルを失うことを危険にさらすことはありません。
Jpsy 14

コマンドで先頭の/を使用しています
ジェイミークック

@jpsyリンク解除についてのあなたのアドバイスは、それが本当なら非常に良いでしょう。タッチzzzzを試してください。zzzzのリンクを解除します。(呼び出しのリンク解除、rmと同じリンク解除、ただし空想オプションなし、再帰なし)。
ctrl-alt-delor

なぜ使用の-n?(問題の可能性があります)。また、lnがサポートしている-t場合は、これらの場合、-Tまたはdestination/その他の場合に使用します。
ctrl-alt-delor

回答:


150

-fwith lnを使用すると、既に存在するすべてのリンクが上書きされるため、適切なアクセス許可があれば機能するはずです...常に機能します。どのオペレーティングシステムを使用していますか?


私の問題に関する詳細情報を含む質問を更新しました。
ジェロームVerstrynge

私はLinuxの下にいます。
ジェロームヴェルストリンジェ

2
ln私がそうする傾向があるように、パラメーターを切り替えると、-f既存のファイル(リンクターゲット)がスイッチによって破壊されますか?どちらの場合でも-i、少しセキュリティが必要な場合は、パラメーター(ユーザーに上書きを促す)も用意されています。
palswim

2
@palswimこのSOポストはので、それが安全である意味-fだけで呼び出すunlink()link():フードの下stackoverflow.com/a/1466570/157385。ただし、正しい順序を覚えているだけでいいのですが。
マイクブランスキー

4
動作しません。ニーズ-n。受け入れられた回答を参照してください。
ショーンウェルチ

119

わかりました、私は私のエラーがどこにあるか見つけました:1つは/パスの最初を置くべきではありません。

言い換えれば、私の質問のコマンドは次のようになります。

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}

私の場合を考えて。


22
その理由に関する追加情報については、1つはrelativeパス(先頭の/なし)ともう1つはパス(absolute先頭の/あり)です。Linuxシステムを管理している場合は、違いを理解することが重要です。たとえば、あなたの仕事を続けるかどうかの違いrm -rf ./*rm -rf /.*決定:)
サファド

5
これは、質問に答えるdoesntの「を更新する方法/ SYMリンクオーバライド」
Sirch

ln -sfn {path / to / file-name} {link-name}行はそうです。
ジェロームVerstrynge

6
-n(--no-dereference)は、リンクをたどるのではなく、{link name}を通常のファイルのように扱います。そのリンクをたどらないで操作する必要がある場合は、このオプションを使用する必要があります。
フェルドー

1
この回答は-n、シンボルリンクを置き換えるためのパラメータを含むハイライト回答である必要があります。
ニック・ツァイ

12

創刊:

引用:

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

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

〜/ 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

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

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

6
$ 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

1レベルのディレクトリでテストを実行すると動作しますが、マルチレベルのディレクトリを使用しようとしていますが、動作しません。質問を更新しました。
ジェロームVerstrynge
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.