it-swarm-vi.com

Tạo một liên kết tượng trưng đến một tên đường dẫn tương đối

Tôi có thể làm điều này:

$ pwd
/home/beau
$ ln -s /home/beau/foo/bar.txt /home/beau/bar.txt
$ readlink -f bar.txt
/home/beau/foo/bar.txt

Nhưng tôi muốn có thể làm điều này:

$ pwd
/home/beau
$ cd foo
$ ln -s bar.txt /home/beau/bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Điều này có thể không? Tôi có thể bằng cách nào đó giải quyết tên đường dẫn tương đối và chuyển nó thành ln không?

65
Humphrey Bogart

Nếu bạn tạo một liên kết tượng trưng đến một đường dẫn tương đối, nó sẽ lưu trữ nó dưới dạng một liên kết tượng trưng tương đối, không tuyệt đối như ví dụ của bạn hiển thị. Đây nói chung là một điều tốt. Liên kết tượng trưng tuyệt đối không hoạt động khi hệ thống tập tin được gắn ở nơi khác.

Lý do ví dụ của bạn không hoạt động là vì nó liên quan đến thư mục mẹ của liên kết tượng trưng và không chạy ln.

Bạn có thể làm:

$ pwd
/home/beau
$ ln -s foo/bar.txt bar.txt
$ readlink -f /home/beau/bar.txt
/home/beau/foo/bar.txt

Hoặc cho vấn đề đó:

$ cd foo
$ ln -s foo/bar.txt ../bar.txt

Điều quan trọng là nhận ra rằng đối số đầu tiên sau ln -s được lưu trữ làm mục tiêu của symlink. Nó có thể là bất kỳ chuỗi tùy ý nào (với các hạn chế duy nhất là nó không thể trống và không thể chứa ký tự NUL), nhưng tại thời điểm symlink đang được sử dụng và giải quyết, chuỗi đó được hiểu là một đường dẫn tương đối đến thư mục mẹ của symlink (khi nó không bắt đầu bằng /).

66
penguin359

Nếu bạn sử dụng coreutils mới hơn (Tôi đang sử dụng coreutils-8.22-11), thì có một tùy chọn để làm điều đó:

ln --help | grep relative

có thể giữ văn bản tùy ý; nếu sau này được giải quyết, một liên kết tương đối là -r, --relative tạo các liên kết tượng trưng liên quan đến vị trí liên kết

Ví dụ:

$ mkdir /tmp/test
$ touch /tmp/test/to
$ ln -rs /tmp/test/to /tmp/test/from
$ ls -l /tmp/test/from
    lrwxrwxrwx 1 ptr ptr 4 aug   25 17.02 /tmp/test/to -> from
25
ptr

Xin lỗi, không. Liên kết tượng trưng có liên quan đến vị trí của liên kết, không phải vị trí bạn đã tạo khi bạn tạo liên kết. Có một số lý do tốt cho hành vi này, hầu hết trong số đó liên quan đến việc gắn hệ thống tập tin từ xa.

12
Shadur

Có một tiện ích nhỏ tiện lợi có tên symlinks (ban đầu bởi Mark Lords, hiện được J. Brandt Buckley duy trì), có mặt trong nhiều bản phân phối Linux.

Để chuyển đổi tất cả các liên kết tượng trưng tuyệt đối trong một thư mục thành tương đối:

symlinks -c /path/to/directory

Thật không may, không có tùy chọn để chuyển đổi một liên kết duy nhất, trước tiên bạn phải chuyển nó vào thư mục riêng của nó.

mkdir ../tmp
mv link-to-relativize ../tmp
symlinks ../tmp
mv ../tmp/* .
rmdir ../tmp

Bạn có thể thử:

ln -s `pwd`/bar.txt /home/beau/bar.txt

Nhưng, nó tạo ra một liên kết tượng trưng đến tên đường dẫn tuyệt đối. Câu hỏi văn bản của bạn yêu cầu đề cập đến tên đường dẫn tương đối ...

Thông thường, một tên đường dẫn tương đối là những gì bạn muốn và những gì ln -s mang đến cho bạn. Tôi nghĩ những gì bạn muốn là:

cd /home/beau
ln -s foo/bar.txt bar.txt
3
MattBianco

Khi các shell phổ biến nhất mở rộng đường dẫn, để tạo một liên kết tượng trưng tương đối, bạn nên trích dẫn "đường dẫn nguồn".

Ngoài ra, -s tham số có nghĩa là --symbolic. ln tạo các liên kết cứng theo mặc định.

$ ln -s '../../relative_path' path
$ ls -al path

lrwxrwxrwx 1 empjustine empjustine 19 Aug  6 01:38 path -> ../../relative/path
1
emp.justine

Nếu bạn chắc chắn không có cơ hội thay đổi điểm gắn kết của bạn, bạn có thể đạt được những gì bạn đang cố gắng thực hiện trong bash Shell như thế này:

ln -s `pwd`/bar.txt ~/bar.txt

Điều này giả định rằng bạn đang ở trong thư mục đích khi tạo liên kết tượng trưng.

0
mreff555