は、だから私は、シンボリックリンクを作成しました:シンボリックリンクを最初に削除せずに編集する方法はありますか?
ln -s /location/to/link linkname
今、私はそのシンボリックリンクがリンクする場所を変更したいです。それ、どうやったら出来るの?それを最初に削除することなくそれを行う方法はありますか?
は、だから私は、シンボリックリンクを作成しました:シンボリックリンクを最初に削除せずに編集する方法はありますか?
ln -s /location/to/link linkname
今、私はそのシンボリックリンクがリンクする場所を変更したいです。それ、どうやったら出来るの?それを最初に削除することなくそれを行う方法はありますか?
新しいリンクを別の名前で作成し、それを移動して古いリンクを置き換えることができます。
ln -s /location/to/link linkname
その後
ln -s /location/to/link2 newlink
mv newlink linkname
newlink
とlinkname
mv
がアトミックである必要があり、同じ物理デバイス上にある場合。
@Andrew - http://en.wikipedia.org/wiki/Atomic_operation –
これはいくつかのOSで動作すると確信していますが、これは私のためには機能しませんでした。古いものを置き換える。私はまだ最初にrmしなければならなかった。 – pstanton
@pstantonあなたは 'mv newlink linkname'が' newlink'ファイルを削除させたが、 'linkname'ファイルを上書きしていないことを意味していますか?これは黙ってこれをしましたか?それは非常に不思議なようだ。 –
いいえ。symlink
システムコールは、newpathがすでに存在する場合はEEXIST
を返します。ファイルシステム内の新しいノードからのみリンクできます。ここには何が必要ですか? unlink/symlink呼び出しの非アトミック性のためにレースが心配している場合は、他の場所で同期を提供するためにアーキテクチャーを少し再考したいかもしれません。この種の事によって導入されたいくつかの恐ろしいセキュリティバグがありました。
お試しln -sf new_destination linkname
これは非原子的です。詳細は私の答えを見てください。それがポスターの懸念であるかどうかはわかりません。 –
これは、ディレクトリを指すシンボリックリンクでは機能しません。古いターゲットディレクトリの中に新しいシンボリックリンクを作成するだけです。 – samxli
これを解決するには、-n(--no-dereference)スイッチを使用します。 –
他にも言及したように、手動で、または-f
フラグをln
ユーティリティに渡すことによって、シンボリックリンクを最初に削除する必要があります。
年前、私はシンボリックリンクをかなり頻繁に編集しなければならなかったので、私は単純なreadlineベースのユーティリティ(edln
)を書いてこれをあまり厄介なものにしました。他の誰かが役に立つと思ったら、私はhttps://github.com/jjlin/edln/にオンラインにしました。
edln
は、元のシンボリックリンクのターゲットを表示します。矢印キーまたは標準的なreadlineキーストローク(M-b
、M-f
、C-d
など)を使用して移動し、ターゲットを編集することができます。
チェーン、このようなコマンド:
rm currentlink && ln -s /path/to/link currentlink
は、最初のコマンドは既存のものを削除し、第二には、すぐにそれを再度作成します。
シンボリックリンクのターゲットがディレクトリの場合は、フラグをmv
コマンドに追加する必要があります。それ以外の場合は、新しいシンボリックリンクを古いシンボリックリンクのターゲットディレクトリに移動します。
アトミック新しいバージョンへのウェブサイトの切り替えの例: - :古いバージョンを参照して、ウェブサイトに
ln -s www1 www
ブラウズ
オリジナルセットアップのウェブサイトは、www1
ディレクトリに保存されたバーチャルホストはwww
シンボリックリンクを指しています。
新しいウェブサイトファイルを新しいwww2
ディレクトリに置きます。すぐに新しいバージョンを参照してください、ウェブサイトに
mv -T www_new www
ブラウズ:新しいウェブサイトのディレクトリに
ln -s www_new www2
移動www
シンボリックリンク:
は、新しいウェブサイトへの新しいシンボリックリンクを設定します。 OSX上で
私のNASのマイクロカーネルのmvのバージョンは、明らかに-T引数をサポートしていません。これを原子的に行うための代替案はありますか? – OcularProgrammer
-f(force)フラグを付けてシンボリックリンクを作成してみてください。それはうまくいくようです。以下の答えを参照してください: 'ln -sf new_destination linkname' –
、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.
、あなたがしたいです目的: ln -sfT/location/to/new/target old_linkname
ただ、グーグルこれは、2番目のコマンドを呼び出さなければならないよりはるかに良い解決策です – dsymquen
、何の良い答えを見つけていないし、自分自身を解決しなければならなかった:
ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary
編集定義により、ゼロから作り直すしかし、部分的に変更しないことを意味します。長くても奇妙な記号であれ、パスを暗記する必要がある答えは間違いです。
ただ、シンボリックリンクのターゲットを変更します。
# ln -sfT /path/to/new/target linkname
これは、インスタント、アトミックな変化です。
私はあなたがここでより良い応答を得ると思います:http://serverfault.com/ –