シンボリックリンクの生成を強制する方法は?

シンボリックリンクの生成を強制する方法は?

日付別に構成(名前指定)された他のディレクトリを含む特定のディレクトリがあります。簡単に参照できるように、current最新のシンボリックリンクを指すリンクを指定しました。

新しい日付ディレクトリを生成するスクリプトで、生成current後に最新のディレクトリを指すようにシンボリックリンクを作成または変更したいと思います。

たとえば、適切なコマンドは次のとおりです。

ln -fs 2017-03-01 current

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


ただし、currentシンボリックリンクがすでに作成されている場合(そしてディレクトリを指している場合2017-02-28動作しません:

その結果、シンボリックリンクを削除して次を指す新しいシンボリックリンクをcurrent作成するのではなく、壊れたシンボリックリンクになります。current2017-03-01~と呼ばれる 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番目の要約形式は、最終オペランドが既存のディレクトリに名前を付けるときに使用する必要があります。


それでは方法がないようです。シンボリックリンクの再指定現在のディレクトリを指しています。新しい目標に向けて、新しいターゲットに名前がある場合その他シンボリックリンクの名前です。だからln -fs思った通りにはなりませんね。

〜しなければならないrm current、それとも私が見落としている別の方法はありますか?

答え1

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ただし、バイナリは-nGNUとの互換性のためにのみサポートできます。

このフラグは同じ場所にリダイレクトするためにも必要です-f

関連情報