【问题标题】:How to create symlink to another symlink without following symlink while keeping relative path?如何在不遵循符号链接的情况下创建指向另一个符号链接的符号链接,同时保持相对路径?
【发布时间】: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 文件...

标签: bash symlink ln


【解决方案1】:

好像ln -s -r 跟随链接..

如果没有-r 选项,ln -s 会准确地输入您输入的内容 - 因此稍后可以更改另一个链接并且第一个目录仍然有效。

# mkdir ABC
# mkdir DEF
# touch DEF/xx.txt
# ls -lAF DEF
total 8
drwxr-xr-x. 2 root root 4096 2021-03-17 11:40 ./
drwxrwxrwt. 4 root root 4096 2021-03-17 11:40 ../
-rw-r--r--. 1 root root    0 2021-03-17 11:40 xx.txt
# ln -s DEF/xx.txt 
# ls -laF
total 16
drwxrwxrwt.  4 root root 4096 2021-03-17 11:40 ./
drwxr-xr-x. 21 root root 4096 2017-03-17 14:13 ../
drwxr-xr-x.  2 root root 4096 2021-03-17 11:40 ABC/
drwxr-xr-x.  2 root root 4096 2021-03-17 11:40 DEF/
lrwxrwxrwx.  1 root root   10 2021-03-17 11:40 xx.txt -> DEF/xx.txt
# cd ABC/
# ln -s ../xx.txt 
# ls -laF
total 8
drwxr-xr-x. 2 root root 4096 2021-03-17 11:40 ./
drwxrwxrwt. 4 root root 4096 2021-03-17 11:40 ../
lrwxrwxrwx. 1 root root    9 2021-03-17 11:40 xx.txt -> ../xx.txt
# echo "ABC" > DEF/xx.txt
# cat ABC/xx.txt
ABC

因此,所有软链接都是指向另一个软链接或文件的软链接 - 没有完全解析。

【讨论】:

  • 注意:猫只是为了表明它正在解析链接 -> 链接 -> 文件。
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 2019-03-31
  • 2011-06-09
  • 2018-11-06
  • 2015-11-06
  • 2012-09-19
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多