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

drj*_*rm3 95 bash symlink

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

假设我不会提前知道是否/path/to/recent/file存在,我该如何创建它(如果它不存在)或替换它(如果它存在)?我确定我可以检查它是否存在,然后进行删除、符号链接,但我想知道是否有一个简单的命令可以在一个步骤中完成我想要的操作。

Ste*_*itt 124

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

ln -sf /path/to/data/folder/month/date/hour/minute/file /path/to/recent/file
Run Code Online (Sandbox Code Playgroud)

将创建/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
Run Code Online (Sandbox Code Playgroud)

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


小智 67

请阅读手册

ln -sfn /new/target /path/to/symlink
Run Code Online (Sandbox Code Playgroud)

$ man ln

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

  • @Mrchief 如果`/path/to/symlink` 已经是一个目录的符号链接,没有`-n` 标志,你将得到在`/path/to/symlink/target` 中创建的符号链接,而不是替换`/路径/到/符号链接` (6认同)
  • 为什么这是正确答案? (4认同)
  • 请注意,在 macOS 中,这在某些情况下仍然不起作用,例如,当 `/path/to/symlink` 存在并且是目录而不是符号链接时。我认为解决它的唯一方法是先运行 `rm -rf`。 (2认同)
  • 这是正确的答案,因为它适用于文件和目录。 (2认同)