将相对符号链接转换为绝对符号链接

Eri*_*ric 11 bash

如何在bash中递归地将相对符号链接转换为绝对符号链接?

thk*_*ala 18

ln -sf "$(readlink -f "$link")" "$link"
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用以下命令对当前工作目录下的所有符号链接执行此操作:`find ./ -type l -execdir bash -c'ln -sfn"$(readlink -f"$ 0")""$ 0"'{} \; ` (4认同)
  • @MariusGedminas如果你添加 -T (--no-target-directories) 作为 ln 的参数,那么它就会成功。 (2认同)

Tim*_*nov 5

以防有人寻找逆向操作:从绝对链接转换为相对:

使用python:

find . -lname "`pwd`*" -exec sh -c 'ln -snvf `python -c "from os.path import *; print relpath(\"$(readlink {})\",dirname(\"{}\"))"` {}' \;
Run Code Online (Sandbox Code Playgroud)

仅使用bash和sed:

find . -lname "`pwd`/*" -depth 1 -exec sh -c 'ln -snvf `echo $(readlink {}) | sed "s|\`pwd\`|.|"` {}' \;
find . -lname "`pwd`/*" -depth 2 -exec sh -c 'ln -snvf `echo $(readlink {}) | sed "s|\`pwd\`|..|"` {}' \;
find . -lname "`pwd`/*" -depth 3 -exec sh -c 'ln -snvf `echo $(readlink {}) | sed "s|\`pwd\`|../..|"` {}' \;
etc....
Run Code Online (Sandbox Code Playgroud)

这会将子目录中的所有绝对链接转换为相对链接.