我有一个特定的目录,其中包含按日期组织(命名)的其他目录。为了便于参考,我有一个名为current
指向最新符号链接。
在创建新日期目录的脚本中,我希望创建或修复符号current
链接以指向创建后的最新目录。
我认为适当的命令就是,例如,
ln -fs 2017-03-01 current
如果current
符号链接尚不存在,则此方法有效。
但是,如果current
符号链接已经创建(并且指向目录2017-02-28
),则此不起作用:
结果将是一个损坏的符号链接,而不是删除符号链接current
并创建一个current
指向 的新符号链接2017-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
描述
...
当最终操作数命名现有目录时,应采用第二种概要形式。
那么看来是没有办法了重新指向符号链接当前指向一个目录向着新的目标,其中新目标有一个名称不同的从符号链接的名称。所以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
使用方式相同,但二进制文件可能-n
只是为了与 GNU 兼容而支持。
将其重新指向同一位置也需要该-f
标志。