web-dev-qa-db-ja.com

最初に削除せずにシンボリックリンクを編集する方法はありますか?

だから私はシンボリックリンクを作成しました:

ln -s /location/to/link linkname

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

60
Andrew

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

ln -s /location/to/link linkname

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

newlinklinknameが同じ物理デバイス上にある場合、mvはアトミックでなければなりません。

39
martin clayton

ln -sf new_destination linkname

24
Phil

シンボリックリンクのターゲットがディレクトリの場合、-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

ウェブサイトを閲覧し、すぐに新しいバージョンをご覧ください。

17
ben_nuttall

Symlinkターゲットを変更するだけです:

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

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

14
Jake Wilson

ディレクトリについては、次のようにします。ln -sfT/location/to/new/target old_linkname

7
raa

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.
6
jschank

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

5
Andy Ross

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

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

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

4
Pete

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

数年前、シンボリックリンクの小さな編集をかなり頻繁に行わなければならなかったので、単純なreadlineベースのユーティリティ(edln)を作成して、これを煩わしくしませんでした。他の誰かがそれを便利だと思う場合、私はそれを https://github.com/jjlin/edln/ でオンラインにした。

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

3
jjlin

グーグルで検索して、良い答えが見つからず、自分で解決しなければなりませんでした:

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

定義による編集とは、ゼロから再作成するのではなく、部分的に変更することを意味します。パスを暗記する必要がある回答は、おそらく長いか、奇妙なシンボルを使用して、間違いなく悪いです。

0
user1046885