2010-11-15 135 views

回答

15
ln -sf "$(readlink -f "$link")" "$link" 
+0

+1,不知道关于readlink的canonicalization选项! – Flexo 2010-11-15 17:46:13

+1

您可以使用以下命令对当前工作目录下的所有符号链接执行此操作:find ./ -type l -execdir bash -c'ln -sfn“$(readlink -f”$ 0“)”“$ 0”'{} \ ;' – 2014-01-31 01:37:44

+0

对于指向目录的符号链接,这将失败:它会在目录内创建新的符号链接(例如,对于符号链接foo - > ../foo,您将获得foo/foo - >/abs/path/to/foo) 。 – 2015-09-17 12:14:00

5

万一有人找反向操作:从绝对链接转换为相对:

使用Python:

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

只使用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.... 

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

+0

还有一个符号链接包可用:'symlinks -a/path/to/modify' http://linux.die.net/man/8/symlinks – pztrick 2016-08-18 00:06:58

+0

不幸的是,它在某些操作系统上不可用。 ;( – 2017-11-02 18:40:25

+0

)您可以下载Debian源文件并运行'gcc symlinks.c -o/usr/local/bin/symlinks'。似乎不依赖于其他任何东西。http://http.debian.net/ debian/pool/main/s/symlinks/symlinks_1.4.orig.tar.gz – pztrick 2017-11-02 19:09:49

0

基于@ thkala的回答,我说这对我的.bashrc:

function lnabs { 
    #http://stackoverflow.com/questions/4187210/convert-relative-symbolic-links-to-absolute-symbolic-links 
    ln -sf "$(readlink -f "$1")" "$*" 
    }