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


64

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ó đến ln?


Nhưng vấn đề mà nó sẽ được giải quyết với hành vi được mô tả là gì?
Forcefsck

Chà, giả sử bạn cung cấp một thư mục nén để tải xuống và muốn đưa ra các hướng dẫn có thể sao chép về cách liên kết một số tệp của thư mục.
Humphrey Bogart

2
ln -s $(pwd)/bar.txt ~/hoặc bao gồm một tập lệnh cài đặt.
Forcefsck

2
liên kết lưu trữ thực sự tên bạn sử dụng trên dòng lệnh. Việc phân giải tên đó thành một tệp được thực hiện liên quan đến vị trí liên kết. Bạn phải sử dụngln -s foo/bar.txt /home/beau/bar.txt
pqnet

Câu trả lời:


62

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 lnchạy ở đâu .

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à phải 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 liên kết tượng trưng. 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 /).


2
Lời nói thân thiện. Bạn đã trả lời điều này trong khi tôi đang gõ câu trả lời của riêng tôi. :)
Shadur

Tôi chỉ có một câu hỏi hơi khác - và câu trả lời này hoàn hảo. Tôi muốn biết làm thế nào để tham chiếu thư mục chính trong symlink để nó hoạt động khi tôi chuyển nó từ người dùng này sang người dùng khác. Tôi không chắc chắn nếu một cái gì đó như ~sẽ làm việc.
Joe

"Chuỗi đó được hiểu là một đường dẫn tương đối đến thư mục mẹ của symlink" - điều này giải thích mọi thứ!
Bojan Komazec

24

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

Hừm, đối với tôi dường như không có lựa chọn nào như vậy -r. Sử dụng Mac mặc dù.
ivkremer

1
@ivkremer có vẻ như tùy chọn này khả dụng vì coreutils> = 8.16 (nguồn: superuser.com/a/837935/403979 )
DJCrashdummy

Sử dụng cờ tương đối dường như để làm sáng tỏ các vấn đề về "quá nhiều cấp độ liên kết tượng trưng" mà tôi đã gặp phải.
Vix

12

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 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.


7

Có một tiện ích nhỏ tiện lợi được gọi là symlinks(ban đầu bởi Mark Lords, hiện được duy trì bởi J. Brandt Buckley), 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 di chuyển nó đến thư mục riêng của nó.

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

cảm ơn. symlink có sẵn trên github . Duy trì bởi J. Brandt Buckley. v1.4.3 .
Evgeny Vereshchagin

3

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 -smang lại cho bạn. Tôi nghĩ những gì bạn muốn là:

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

1

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, các -stham số có nghĩa --symbolic. lntạo 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

0

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 vỏ bash 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.