2009-11-13 1 views
48

は、だから私は、シンボリックリンクを作成しました:シンボリックリンクを最初に削除せずに編集する方法はありますか?

ln -s /location/to/link linkname 

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

+1

私はあなたがここでより良い応答を得ると思います:http://serverfault.com/ –

答えて

26

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

ln -s /location/to/link linkname 

その後

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

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

+1

@Andrew - http://en.wikipedia.org/wiki/Atomic_operation –

+0

これはいくつかのOSで動作すると確信していますが、これは私のためには機能しませんでした。古いものを置き換える。私はまだ最初にrmしなければならなかった。 – pstanton

+0

@pstantonあなたは 'mv newlink linkname'が' newlink'ファイルを削除させたが、 'linkname'ファイルを上書きしていないことを意味していますか?これは黙ってこれをしましたか?それは非常に不思議なようだ。 –

5

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

19

お試しln -sf new_destination linkname

+1

これは非原子的です。詳細は私の答えを見てください。それがポスターの懸念であるかどうかはわかりません。 –

+10

これは、ディレクトリを指すシンボリックリンクでは機能しません。古いターゲットディレクトリの中に新しいシンボリックリンクを作成するだけです。 – samxli

+10

これを解決するには、-n(--no-dereference)スイッチを使用します。 –

3

他にも言及したように、手動で、または-fフラグをlnユーティリティに渡すことによって、シンボリックリンクを最初に削除する必要があります。

年前、私はシンボリックリンクをかなり頻繁に編集しなければならなかったので、私は単純なreadlineベースのユーティリティ(edln)を書いてこれをあまり厄介なものにしました。他の誰かが役に立つと思ったら、私はhttps://github.com/jjlin/edln/にオンラインにしました。

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

4

チェーン、このようなコマンド:

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

は、最初のコマンドは既存のものを削除し、第二には、すぐにそれを再度作成します。

13

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

アトミック新しいバージョンへのウェブサイトの切り替えの例: - :古いバージョンを参照して、ウェブサイトに

ln -s www1 www 

ブラウズ

オリジナルセットアップのウェブサイトは、www1ディレクトリに保存されたバーチャルホストはwwwシンボリックリンクを指しています。

新しいウェブサイトファイルを新しいwww2ディレクトリに置きます。すぐに新しいバージョンを参照してください、ウェブサイトに

mv -T www_new www 

ブラウズ:新しいウェブサイトのディレクトリに

ln -s www_new www2 

移動wwwシンボリックリンク:

は、新しいウェブサイトへの新しいシンボリックリンクを設定します。 OSX上で

+0

私のNASのマイクロカーネルのmvのバージョンは、明らかに-T引数をサポートしていません。これを原子的に行うための代替案はありますか? – OcularProgrammer

+0

-f(force)フラグを付けてシンボリックリンクを作成してみてください。それはうまくいくようです。以下の答えを参照してください: 'ln -sf new_destination linkname' –

6

、LNのmanページでは、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. 
7

、あなたがしたいです目的: ln -sfT/location/to/new/target old_linkname

ただ、グーグル
+0

これは、2番目のコマンドを呼び出さなければならないよりはるかに良い解決策です – dsymquen

0

、何の良い答えを見つけていないし、自分自身を解決しなければならなかった:

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

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

6

ただ、シンボリックリンクのターゲットを変更します。

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

これは、インスタント、アトミックな変化です。

関連する問題