2010-11-15 57 views

Trả lời

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

+1, không biết về các tùy chọn chuẩn hóa cho readlink! – Flexo

+1

Bạn có thể thực hiện việc này cho tất cả các liên kết tượng trưng trong thư mục làm việc hiện tại bằng cách sử dụng: 'find ./ -type l -execdir bash -c 'ln -sfn' $ (readlink -f" $ 0 ")" "$ 0" '{} \ ; ' –

+0

Đối với các liên kết tượng trưng trỏ đến các thư mục không thành công: nó tạo các liên kết mới có cùng tên trong thư mục (ví dụ: foo -> ../foo bạn nhận foo/foo ->/abs/path/to/foo) . –

5

Chỉ trong trường hợp ai đó tìm kiếm hoạt động ngược lại: chuyển đổi từ các liên kết tuyệt đối tương đối:

Sử dụng python:

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

Chỉ sử dụng bash và 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.... 

Điều này sẽ chuyển đổi tất cả các liên kết tuyệt đối trong các thư mục con thành các liên kết tương đối.

+0

Ngoài ra còn có một gói symlink có sẵn: 'symlinks -a/path/to/modify' http://linux.die.net/man/8/symlinks – pztrick

+0

Thật không may nó không có sẵn trên một số hệ điều hành. ; ( –

+0

Bạn có thể tải xuống tệp nguồn Debian và chỉ chạy 'gcc symlinks.c -o/usr/local/bin/symlinks'. Có vẻ như không phụ thuộc vào bất kỳ điều gì khác. Http://http.debian.net/ debian/pool/main/s/symlinks/symlinks_1.4.orig.tar.gz – pztrick

0

Dựa trên câu trả lời @ thkala, tôi bổ sung này để .bashrc của tôi:

function lnabs { 
    #http://stackoverflow.com/questions/4187210/convert-relative-symbolic-links-to-absolute-symbolic-links 
    ln -sf "$(readlink -f "$1")" "$*" 
    } 
Các vấn đề liên quan