【发布时间】:2021-03-16 20:05:43
【问题描述】:
如何在不跟随目标符号链接但保持目标符号链接和创建的符号链接之间的相对路径的情况下创建指向另一个符号链接的符号链接?
使用如下结构进行测试
├── dst
│
└── src
├── file.txt -> folder/file.txt
└── folder
└── file.txt
lrwxrwxrwx 1 user group 15 mars 16 20:05 src/file.txt -> folder/file.txt
每次我尝试在dst 文件夹中创建src/file.txt 的符号链接(本身是src/folder/file.txt 的相对符号链接)时,生成的符号链接永远不会像dst/file.txt -> ../src/file.txt 那样,但总是直接指向最终目标dst/file.txt -> ../src/folder/file.txt
ln -s -r [-T] 'src/file.txt' dst/file.txt
仅在没有-r 的情况下工作并为自己指定相对路径
ln -s '../src/file.txt' dst/file.txt
我需要在 for 循环中对许多文件递归地使用它,我想在符号链接之间保留相对路径,但不遵循目标符号链接,只是到另一个符号链接的相对符号链接。
是否可以在不遵循目标符号链接的情况下将 ln 与 -r 相对选项一起使用?
问候
【问题讨论】:
-
使用时,符号链接的值在文件名的位置进行评估..所以file.txt的值必须是
../src/file.txt。如果您在dest并执行ln -s ../src/file.txt file.txt,它将指向 src 文件夹中的链接,并在评估时解析为folder/file.txt时间。这是一个常见的习惯用法...您有一个指向当前版本目录的符号链接,然后./current/foo.bar解析为当前链接后面的那个。您交换当前版本,所有链接都会自动指向新版本。 -
@MrR,你好,我正在从
src/和dst/文件夹的父文件夹进行测试,就像我正在执行像for file in src/**/*; do ln s -r "${file}" "${file//src/dst}"; done这样的 for 循环(最好使用find ./src/ -type l仅捕获src/中的符号链接),这将为src/中的每个符号链接在dst/中创建一个新符号链接,保持src/dstsymlinks 之间的相对路径,但不尝试遵循目标符号链接(仅保留符号链接参考)。有些工具可以选择不遵循符号链接。我从ln读到了 man ,但这很短。ln -r是获取目标和链接之间相对路径的做法。 -
find 似乎好多了 - 因为它不跟随链接但可以找到链接......例如从 dst 目录中你可以做这样的事情 -
find ../src -type l -print0 | xargs -0 ln -s或者如果你想要具有特定模式的东西 -find ../src \( -type l -o -type f \) -name \*.txt -print0 | xargs -0 ln -s -
@MrR 我同意你的看法。我将使用查找。但我的目的是保持
src/和dst/的符号链接之间的相对路径而不跟随它们。ln中的相对-r选项开箱即用,但似乎遵循符号链接而不保留它们。dst/file.txt符号链接只需要指向/src/file.txt符号链接(不遵循它的实际值)并作为dst/file.txt -> ../src/file.txt。这里很简单,因为有两个文件夹,但在超过 1000 个文件夹的层次结构中,有许多符号链接,在 src/dst 之间获取相对路径是不同的。 -
我的示例符合您的描述。然而这并不像这样简单,如果您有文件夹,那么它们可能也可以更改 - 所以您需要在创建链接之前创建所有文件夹.. 如果您正在执行“在目录中创建”,您需要找到所有包含要链接的内容的目录,在
dst中创建目录,然后链接文件。并且您要确保您最终不会得到folder文件...