日付で整理された(名前付きの)他のディレクトリでいっぱいの特定のディレクトリがあります。参照しやすいように、最新のシンボリックリンクを指す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
ですが、見落としている別のアプローチはありますか?
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
をサポートしている可能性があります 。