シンボリックリンクターゲットを更新する方法(ln -f -sが機能しない)


45

私は使っています

ln -f -s / var / www / html / releases / build1390 app-current

シンボリックリンク「app-current」を新しい宛先で更新します。しかし、これは機能せず、リンク「app-current」は元の宛先を保持しますが、エラーは表示されません...

リンクを削除して再作成するのではなく、既存のリンクのターゲットを更新するだけです。それは可能ですか?

回答:


55

それは私のために働いています、出力はstrace ln -f -s /var/www/html/releases/build1390 app-current何ですか?

ああ、それはあなたが-n逆参照なしに追加する必要があるディレクトリであり、これは問題を解決するはずです。-fとにかく-fを追加するとリンクが解除されるだけなので、本当に便利です。おそらく、通常の負荷のシステムでは数百ミリ秒速くなると思います。

たとえば、arfがすでに/ homeを指している場合:

strace With -n

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

straceなし-n

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

その-nため、arfを使用しないと逆参照されるため、lnは実際にarfとして扱い/ます。あなたの特定の例では、エラーがなければ、おそらく内部に新しいシンボリックリンクを作成しており、/var/www/html/releases/build1390 app-currentそれをクリーンアップしたいと思うでしょう。


4
素晴らしい、それは-nでした。どうもありがとう!
ソルソル

12

-nまたは--no-dereferenceを使用して、ターゲットがシンボリックリンクである場合にターゲットが逆参照されるのを防ぐことができます。-Tまたは--no-target-directoryを使用して、ターゲットファイルが常に通常のファイルとして処理されるようにすることもできます。

次の例に示すように、これらは少し異なる動作を生成します。しsrc、いくつかのファイルであるdirlinkディレクトリへのシンボリックリンクで、dir実際のディレクトリです。

を使用して-n

  • ln -sfn src dirlink上書きdirlinkしてリンクしますsrc
  • ln -sfn src dir リンクを作成します dir/src -> src

を使用して-T

  • ln -sfT src dirlink上書きdirlinkしてリンクしますsrc
  • ln -sfT src dir エラーメッセージを生成します: ln: ‘dir’: cannot overwrite directory

1
Linuxユーザーにとって最も正確で簡潔な答えがあります。
ロス

エラーメッセージが表示されないようにターゲットディレクトリを強制的に上書きする方法はありますcannot overwrite directoryか?
gitaarik

@rednawいくつかのコマンドを連鎖させることでこれを行うことができますが、それln自体はディレクトリを削除しません。これは、おそらく膨大な数のファイルを再帰的に削除する必要があるため、悪い考えです。
8
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.