だから私はシンボリックリンクを作成しました:
ln -s /location/to/link linkname
次に、シンボリックリンクのリンク先の場所を変更します。それ、どうやったら出来るの?最初に削除せずにそれを行う方法はありますか?
別の名前で新しいリンクを作成し、それを移動して古いリンクを置き換えることができます。
ln -s /location/to/link linkname
後
ln -s /location/to/link2 newlink
mv newlink linkname
newlink
とlinkname
が同じ物理デバイス上にある場合、mv
はアトミックでなければなりません。
ln -sf new_destination linkname
。
シンボリックリンクのターゲットがディレクトリの場合、-T
フラグをmv
コマンドに追加する必要があります。そうでない場合、新しいシンボリックリンクは古いシンボリックリンクのターゲットディレクトリに移動します。
Webサイトをアトミックに新しいバージョンに切り替える例:
元の設定-ウェブサイトはwww1
ディレクトリに保存され、vhostはwww
シンボリックリンクを指します:
ln -s www1 www
ウェブサイトを閲覧し、古いバージョンをご覧ください。
新しいwww2
ディレクトリに新しいWebサイトファイルを配置します。
新しいWebサイトへの新しいシンボリックリンクを設定します。
ln -s www_new www2
www
シンボリックリンクを新しいWebサイトのディレクトリに移動します。
mv -T www_new www
ウェブサイトを閲覧し、すぐに新しいバージョンをご覧ください。
Symlinkターゲットを変更するだけです:
# ln -sfT /path/to/new/target linkname
これは瞬時のアトミックな変更です。
ディレクトリについては、次のようにします。ln -sfT/location/to/new/target old_linkname
OSXでは、lnのマニュアルページには、次のように実行できると書かれています。
ln -shf /location/to/link link name
Manページから:
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.
いいえ。symlink
システムコールは、newpathが既に存在する場合、EEXIST
を返します。ファイルシステムの新しいノードからのみリンクできます。ここでの要件は何ですか? unlink/symlink呼び出しの非アトミック性が原因で競合が心配な場合は、他の場所で同期を提供するためにアーキテクチャを少し再考する必要があります。この種のものによって導入されたいくつかの恐ろしいセキュリティバグがありました。
次のようにコマンドをチェーンします。
rm currentlink && ln -s /path/to/link currentlink
最初のコマンドは既存のコマンドを削除し、2番目のコマンドはすぐにそれを再度作成します。
他の人が述べたように、基本的に手動で、またはln
ユーティリティに-f
フラグを渡すことにより、最初にシンボリックリンクを削除する必要があります。
数年前、シンボリックリンクの小さな編集をかなり頻繁に行わなければならなかったので、単純なreadlineベースのユーティリティ(edln
)を作成して、これを煩わしくしませんでした。他の誰かがそれを便利だと思う場合、私はそれを https://github.com/jjlin/edln/ でオンラインにした。
edln
は、元のシンボリックリンクターゲットを表示します。次に、矢印キーまたは標準のreadlineキーストローク(M-b
、M-f
、C-d
など)を使用して、ターゲットを移動して編集できます。
グーグルで検索して、良い答えが見つからず、自分で解決しなければなりませんでした:
ln -f -s -T `readlink SomeLibrary | sed 's/version.old/version.new/'` SomeLibrary
定義による編集とは、ゼロから再作成するのではなく、部分的に変更することを意味します。パスを暗記する必要がある回答は、おそらく長いか、奇妙なシンボルを使用して、間違いなく悪いです。