78

そこで、シンボリックリンクを作成しました。

ln -s /location/to/link linkname

次に、シンボリックリンクがリンクする場所を変更したいと思います。それ、どうやったら出来るの?最初に削除せずにそれを行う方法はありますか?

4

10 に答える 10

53

別の名前で新しいリンクを作成し、それを移動して古いリンクを置き換えることができます。

ln -s /location/to/link linkname

後で

ln -s /location/to/link2 newlink
mv newlink linkname

newlinklinknameが同じ物理デバイス上にある場合はmv、アトミックである必要があります。

于 2009-11-13T07:01:03.207 に答える
30

試してみてくださいln -sf new_destination linkname

于 2009-11-13T05:33:46.373 に答える
23

シンボリックリンクのターゲットを変更するだけです:

# ln -sfT /path/to/new/target linkname

これは、瞬時のアトミックな変更です。

于 2015-02-18T05:08:34.760 に答える
17

-Tシンボリック リンクのターゲットがディレクトリの場合は、フラグをコマンドに追加する必要がありますmv。そうしないと、新しいシンボリック リンクが古いシンボリック リンクのターゲット ディレクトリに移動します。

Web サイトを新しいバージョンにアトミックに切り替える例:

元のセットアップ - Web サイトはwww1ディレクトリに保存され、vhost はwwwシンボリック リンクを指します。

ln -s www1 www

ウェブサイトを参照して、古いバージョンを参照してください。

新しい Web サイト ファイルを新しいwww2ディレクトリに配置します。

新しい Web サイトへの新しいシンボリック リンクを設定します。

ln -s www_new www2

wwwシンボリック リンクを新しい Web サイトのディレクトリに移動します。

mv -T www_new www

ウェブサイトを参照して、新しいバージョンをすぐに確認してください。

于 2013-03-26T17:44:00.267 に答える
8

OSXでは、lnのmanページには、このようにできると書かれています

ln -shf /location/to/link link name

マニュアルページから:

The options are as follows:
 -F    If the target file already exists and is a directory, then remove it so that the link may occur.  The -F
       option should be used with either -f or -i options.  If none is specified, -f is implied.  The -F option is
       a no-op unless -s option is specified.

 -h    If the target_file or target_dir is a symbolic link, do not follow it.  This is most useful with the -f
       option, to replace a symlink which may point to a directory.

 -f    If the target file already exists, then unlink it so that the link may occur.  (The -f option overrides any
       previous -i options.)

 -i    Cause ln to write a prompt to standard error if the target file exists.  If the response from the standard
       input begins with the character `y' or `Y', then unlink the target file so that the link may occur.  Other-
       wise, do not attempt the link.  (The -i option overrides any previous -f options.)

 -n    Same as -h, for compatibility with other ln implementations.

 -s    Create a symbolic link.

 -v    Cause ln to be verbose, showing files as they are processed.
于 2014-02-17T21:30:05.837 に答える
5

いいえ。newpathがすでに存在する場合、symlinkシステムコールが返されます。EEXISTファイルシステム内の新しいノードからのみリンクできます。ここでの要件は何ですか?unlink / symlink呼び出しの非アトミック性が原因で競合が心配な場合は、アーキテクチャを少し考え直して、他の場所で同期を提供することをお勧めします。この種のものによって導入されたいくつかの恐ろしいセキュリティバグがありました。

于 2009-11-13T05:33:19.803 に答える
4

次のようにコマンドをチェーンします。

rm currentlink && ln -s /path/to/link currentlink

最初のコマンドは既存のものを削除し、2 番目のコマンドはすぐに再作成します。

于 2013-02-26T09:20:10.303 に答える
3

他の人が述べたように、基本的には、手動で、または-fフラグをlnユーティリティに渡して、最初にシンボリックリンクを削除する必要があります。

edln何年も前に、私はかなり頻繁にシンボリック リンクに小さな編集を加えなければならなかったので、この煩わしさを軽減するために単純な readline ベースのユーティリティ ( ) を書きました。他の誰かが役に立つと思った場合に備えて、https://github.com/jjlin/edln/でオンラインにしました。

edln元のシンボリック リンク ターゲットが表示されます。その後、矢印キーまたは標準の readline キーストローク ( M-bM-fC-dなど) を使用して、ターゲットを移動および編集できます。

于 2012-05-07T00:46:10.443 に答える
1

グーグルで調べただけで、良い答えが見つからず、自分で解決する必要がありました:

ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary

定義による編集とは、ゼロから作り直すのではなく、部分的に変更することを意味します。長いパスや奇妙な記号を含むパスを記憶する必要がある回答は、間違いなく悪いものです。

于 2014-08-29T11:32:38.080 に答える