创建符号链接-如果存在则覆盖


54

我想提取数据/path/to/data/folder/month/date/hour/minute/file并将其符号链接到,/path/to/recent/file并在每次创建文件时自动执行此操作。

假设我不知道是否/path/to/recent/file存在,我该如何创建它(如果它不存在)或替换它(如果它存在)?我敢肯定,我只能检查它是否存在,然后进行删除,符号链接,但是我想知道是否有一个简单的命令可以一步完成我想做的事情。


如果目标存在,但不是符号链接,则您希望/期望发生什么?
Toby Speight

Answers:


34

请阅读手册

ln -sfn /new/target /path/to/symlink

$人

-n,--no-dereference
如果LINK_NAME是指向目录的符号链接,则将其视为普通文件


1
为什么这是正确的答案?
Mrchief

1
@Mrchief如果/path/to/symlink已经是目录的符号链接,没有-n标记,则将在其中创建符号链接,/path/to/symlink/target而不是替换该符号链接/path/to/symlink
Flimm

请注意,在macOS中,这在某些情况下仍然不起作用,例如,当/path/to/symlink存在并且是目录而不是符号链接时。我认为解决此问题的唯一方法是先运行rm -rf
Flimm

78

这是ln-f选项的目的:创建链接之前,它会删除现有的目标文件(如果有)。

ln -sf /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file

将创建/path/to/recent/file指向的/path/to/data/folder/month/date/hour/minute/file符号链接,如有必要,替换任何现有文件或符号链接到文件(如果该文件不存在,则可以正常工作)。

如果目录或目录的符号链接已经存在,并且带有目标名称,则将在其中创建符号链接(因此,/path/to/recent/file/file在上面的示例中将最终得到)。-n在某些版本的中可用的选项ln将为您处理目录的符号链接,并在必要时替换它们:

ln -sfn /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file

POSIXln未指定,-n因此您通常不能依赖它。的大部分ln行为是实现定义的,因此您确实需要检查所用系统的细节。如果您使用的是GNUln,也可以使用-t-T选项,使其在存在目录的情况下完全可预测(失败,而不是在现有目录中使用相同名称创建链接)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.