如何使用相对路径创建另一个目录中文件的符号链接?

如何使用相对路径创建另一个目录中文件的符号链接?

问题

我正在开发一款人工智能训练应用程序。该应用程序使用 docker,并且一些文件夹是共享的(已安装)。docker 内部和外部的绝对路径不同,我需要创建在两者上都有效的符号链接。

路径

应用程序/opt/shared/app

主持人:/opt/<client>/app/ai/training/<uuid>/models

码头工人/workspace/tlt-experiments/training/<uuid>/models

描述

当我执行一个训练程序(在docker内部)时,它会在目录中生成名为model.epoch0.tlt, model.epoch1.tlt, ... model.epoch<n>.tlt

如果我cd进入主机目录或docker目录并执行ln -s model.epoch<n>.tlt model.tlt,我有一个在docker容器内部和主机中有效的链接

但是,如果我从应用程序执行命令来生成链接,我需要使用绝对路由 ln -s /opt/<client>/app/ai/training/<uuid>/models/model.epoch<n>.tlt /opt/<client>/app/ai/training/<uuid>/models/model.tlt,它对主机有效,但如果我在容器内执行任何操作,它就是一个指向任何内容的无效链接。

是否有一种优雅的方式来创建链接(希望不使用cd-ln-cd)?

奖金

我目前用来创建链接的命令如下。它帮助我获取最后一个纪元(n)

ls -t <host>/models/ | head -1 | xargs -I @ ln -s <host>/models/@ <host>/models/model.tlt

附加信息

该应用程序的这部分代码是用 c 编写的,但对于链接,我在 system(str) 调用中将 unix 命令作为解析字符串执行。

答案1

如果我cd进入主机目录或docker目录并执行ln -s model.epoch<n>.tlt model.tlt,我有一个在docker容器内部和主机中有效的链接

链接目标与当前目录无关。指定相对路径作为目标将始终存储该路径精确的链接中的路径,无论您cd是否在某处之后执行此操作。

因此你可以直接使用:

ln -s model.epoch<n>.tlt /opt/<client>/app/ai/training/<uuid>/models/model.tlt

较新的 GNU Coreutils 版本还添加了-r自动将绝对路径转换为相对路径的选项。

相关内容