如果我在当前文件夹中创建一个文件夹,则说日志:-
mkdir log
ln -s -f log all_logs
这样 all_logs 就指向日志目录。
ls -ltr
Jan 7 23:33 log
Jan 7 23:33 all_logs -> log
当我ln -s -f log all_logs
再次运行时,会创建一个递归符号链接里面日志目录,名为log。
ls -ltr log/
Jan 7 23:33 log -> log
为什么会发生这种情况? 现有的符号链接难道不应该只取消链接并重新链接(使用 -f 选项)吗? 为什么会发生这种递归行为?
答案1
现有的符号链接不应该只被取消链接并重新链接吗?
不是。该命令正在将现有链接解析为目录目标,log/.
符号链接不是文件。例如:
# touch test
# mkdir testdir
# ln -s -f testdir test
# ls -l
Jan 7 11:28 test -> testdir
如果链接目标是已经存在的文件,它将被-f
的选项覆盖ln
。
如果您想在 GNU 上覆盖此行为ln
,请使用-T
选项ln
,即“始终将 LINK_NAME 视为普通文件”。
如果在 BSD 上ln
,使用-h
,即“如果 target_file 或 target_dir 是符号链接,则不要遵循它。”
答案2
从手册中提取(对于mv
和来说是相同的cp
,尽管它们没有第二种形式)。
SYNOPSIS
ln [OPTION]... [-T] TARGET LINK_NAME
ln [OPTION]... TARGET
ln [OPTION]... TARGET... DIRECTORY
ln [OPTION]... -t DIRECTORY TARGET...
请注意,第一种形式和第三种形式(当给定 2 个参数时)是模棱两可的。因此,为了避免模棱两可:写入目录时使用第四种形式,和/或附加/
到目录名称。使用第一种形式时(因为没有指定目录),请使用选项-T
。不幸的是,并非所有人都可以使用,因此会发生错误(认为会发生意外)。这种情况-h
可以在 BSD 上使用,或者-n
效果相同,但可以在 BSD 和 GNU 上使用。