web-dev-qa-db-ja.com

シンボリックリンクの作成を強制するには?

日付で整理された(名前付きの)他のディレクトリでいっぱいの特定のディレクトリがあります。参照しやすいように、最新のシンボリックリンクを指すcurrentというシンボリックリンクを用意しています。

新しい日付ディレクトリを作成するスクリプトで、currentシンボリックリンクを作成または修正して、作成された最新のディレクトリを指すようにします。

適切なコマンドは、たとえば、

ln -fs 2017-03-01 current

currentシンボリックリンクがまだ存在しない場合、これは機能します。


ただし、currentシンボリックリンクがすでに作成されている場合(および、たとえば2017-02-28をポイントするとします)、これは機能しません

シンボリックリンクcurrentを削除して2017-03-01を指す新しいシンボリックリンクcurrentを作成する代わりに、結果として壊れたシンボリックリンクが呼び出されます2017-03-01自体を指し、ディレクトリ内に休憩2017-02-28 (これはシンボリックリンクcurrentがポイントし、まだポイントしている場所です)。

これは私を困惑させたので、 ln の仕様を読みました。これは予想される動作です。

あらすじ

ln [-fs] [-L|-P] source_file target_file

ln [-fs] [-L|-P] source_file... target_dir

説明

...

2番目の構文形式は、最後のオペランドが既存のディレクトリを指定する場合に想定されます。


そのため、現在ディレクトリを指しているシンボリックリンクを新しいターゲットに再ポイントする方法はまったくないようですここで、新しいターゲットの名前は、シンボリックリンクの名前とはdifferentです。したがって、ln -fsは、私が思っていたように機能しません。

必須私はrm currentですが、見落としている別のアプローチはありますか?

9
Wildcard

GNUのlnにはln -nがあり、これによりシンボリックリンクを再ポイントできます。

$ mkdir dir1 dir2
$ ln -s dir1 sym
# dir1/
# dir2/
# sym -> dir1/

$ ln -nsf dir2 sym
# dir1/
# dir2/
# sym -> dir2/

BSD coreutilsは-hと同じ方法でフラグ-nを使用します ただし、GNUとの互換性のためだけに、バイナリが-nをサポートしている可能性があります

16