ディレクトリのシンボリックリンクを上書きする方法は?


15

2つのディレクトリfoo1とがありfoo2ます。

最初に、ディレクトリシンボリックリンクを作成しln -s foo1 barます。その後、シンボリックリンクを変更したいので、入力しましたln -sf foo2 bar

しかしbar、まだリンクされていfoo1ます。Symlinkはのfoo2内部に作成されfoo1ます。

置換foo1したい場合は何を入力すればよいfoo2ですか?

3つの環境でテストしました。

  1. Ubuntu 12.04、ln(GNU coreutils)8.13
  2. CentOS 6.4、ln(GNU coreutils)8.4
  3. OS X 10.7.5、ln(バージョンなし)

回答:


17

これを行う適切な方法は、その-n, --no-dereferenceようなオプションを使用することです。

$ ln -snf foo2 bar

これによりln、既存のシンボリックリンクがファイルとして扱われます。それ以外の場合は、を逆参照barfoo1、下に移動foo1して元のTARGET名前をとして使用しLINK_NAMEます。foo2そのため、foo1ディレクトリ内に作成されるシンボリックリンクになります。のマンページにlnは次のように記載されています...

-n、-非参照
       LINK_NAMEがシンボリックリンクである場合、通常のファイルとして扱います
       ディレクトリ

以下は、バージョン8.21と私のアーチのLinuxデスクトップ上のシェル出力であるln場合とない場合--no-dereferenceのオプションは、私はあなたがなしたのと同じ結果だ--no-dereferenceオプションを、しかし使用して--no-dereference期待通りに働いていたオプションを選択します。

$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
  total 0
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2

ご回答有難うございます。環境依存の問題である場合、環境を記述します。どのOSを使用していますか?何を出力しln --versionますか?
Ironsand

これをバージョン8.17のFedora 18 VMで試しました。興味深いことに、バージョン8.21のArch Linuxデスクトップでこれを試したところ、同じ結果が得られました。これらの2つのバージョンの間のどこかで何かが変更されたように見えます。しかし、私が投稿したソリューションは両方のインスタンスで機能しました。
ドリューチャピン

参考までに、私はjustlinux.comフォーラムでこの答えを見つけました。
ドリューチャピン

ありがとうdruciferre!lnコマンドがそれほど頻繁にアップグレードされるとは思いもしませんでした。
Ironsand

osxでもテストしました。lnディレクトリを上書きしln -snfて問題を解決すると、ubuntuおよびcentosと同じように機能します。にもかかわらずln -h、osxで使用するオプションを好む。
Ironsand
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.