2010-11-15 184 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")" "$*" 
    }