Làm cách nào để tạo một liên kết tượng trưng tương đối trong Linux?


Câu trả lời:


78
  1. Chuyển đến thư mục bạn muốn liên kết cư trú
  2. Chạy lệnh ln -s ../some/other/file linkname

Đường dẫn bạn cung cấp được lưu trữ cùng với tệp. Khi bạn truy cập tệp, đường dẫn được lưu trữ sẽ được tra cứu và mở rộng so với tệp. Nó không biết bạn đã ở thư mục nào khi bạn tạo liên kết.


23
Không, bạn không có. Bạn chỉ cần đảm bảo rằng bạn chỉ định vị trí liên quan đến tên liên kết thay vì thư mục hiện tại của bạn.
Ignacio Vazquez-Abrams

5
Để giúp hiểu: Đường dẫn bạn cung cấp được lưu trữ cùng với tệp. Khi bạn truy cập tệp, đường dẫn được lưu trữ sẽ được tra cứu và mở rộng so với tệp. Nó không biết bạn đã ở thư mục nào khi bạn tạo liên kết.
Mary

2
chính xác tương đương:ln -s ../some/other/file /some/dir/linkname
sehe

1
Thay vì đi xuống một thư mục và lên lại, bạn cũng có thể làm như vậy ln -s ./file linknamekể từ khi .đề cập đến thư mục hiện tại.
pduersteler

1
ln -s somedir/original-dir link-namekhông hoạt động. Nó tạo ra một thư mục có tên link-namechứa một liên kết không hợp lệ. Lệnh hoạt động làln -sr somedir/original-dir link-name
Lorenz Meyer

28

Các phiên bản gần đây của GNU coreutils 'ln (> = 8.16) hỗ trợ tùy chọn --relative(hoặc -r) có nghĩa là bạn có thể gọi ln -sbằng 2 đường dẫn tuyệt đối hoặc tương đối (đối với thư mục làm việc của bạn) và nó sẽ tìm ra đường dẫn tương đối chính xác phải có được viết vào symlink.


2
Cảm ơn. Các -rtùy chọn rất hữu ích khi bạn đang cross-biên dịch và cần đường dẫn tuyệt đối trên host xây dựng nhưng đường dẫn tương đối trên mục tiêu.
Robert Calhoun

rdfind có thể tạo ra một số liên kết thực sự xấu không chỉ tuyệt đối mà còn quay lại các thư mục mà không có lý do. ln -r -s targetfile myaliascó thể giúp bạn khắc phục nó
Ray Foss

2

Những gì bạn cần hiểu về cơ bản là một symlink giống như một tệp văn bản hơn là một mục nhập thư mục chứa một tệp. Vì vậy, nếu bạn

echo ../poo >/file/name

thì nó khá giống với

ln -s ../poo /file/name

Hệ thống không quan tâm nếu /file/../pootồn tại, nó chỉ là một đoạn văn bản được đưa vào liên kết tượng trưng. Khi một cái gì đó cố gắng mở symlink, đó là khi hệ thống cố gắng giải quyết nó.

Nếu bạn đang sử dụng shell với hoàn thành tên tệp, tính năng này có thể gây nhầm lẫn mọi thứ bằng cách cho phép bạn hoàn thành một tên tệp liên quan đến thư mục làm việc hiện tại của bạn, ngay cả khi bạn kết thúc việc sử dụng đó làm mục tiêu của một liên kết tượng trưng trong thư mục hoàn toàn khác.


Đây là bị lạm dụng bởi một số cuộc gọi hệ thống - Tôi biết ví dụ như BSD sử dụng để cho phép bạn liên kết mềm một tập tin hệ thống đặc biệt để <thay đổi cách hệ thống phân bổ bộ nhớ. Tất nhiên không có tệp nào có tên <trong thư mục đó, đó chỉ là một cách rẻ tiền để tạo ra một thứ giống như tệp rất nhỏ có một số thuộc tính hấp dẫn so với tệp văn bản thông thường trên nền tảng cụ thể đó.
tripleee

Liên kết đó bây giờ đã chết. Hãy thử man.openbsd.org/OpenBSD-5.3/man5/malloc.conf.5 nhưng cũng lưu ý rằng hành vi trong các phiên bản gần đây của OpenBSD ít ... nhiều màu sắc hơn.
tripleee

0

Liên kết tương đối là khó khăn đối với tôi trên OS X, tức là

~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin ~/bin
~/Dropbox/git/dave-bot $ ln -s ../codyhess/bin/ ~/bin

cả hai đều không hoạt động (một cái gì đó đã được tạo nhưng nó không phải là một thư mục). Tôi đã tạo liên kết mong muốn bằng cách sử dụng các đường dẫn tuyệt đối .

~/Dropbox/git/dave-bot $ ln -s ~/Dropbox/git/codyhess/bin/ ~/bin

Đó là một giải pháp khả thi, vì vậy không cần phải bình luận. Điều này có thể ở lại như một câu trả lời riêng biệt.
slhck

1
Lần thử đầu tiên của bạn với các liên kết tương đối hoàn toàn sai và đó là lý do tại sao nó không hoạt động. Bạn đã hiểu lầm làm thế nào liên kết tương đối làm việc. Không có gì đặc biệt khó khăn về nó (ngay cả khi bạn đang sử dụng OS X). Có lẽ bạn đã hiểu sai bởi các câu trả lời khác nói về cơ hội thư mục làm việc của bạn khi bạn tạo liên kết. Đó chỉ là để làm cho liên kết chính xác dễ dàng hơn và không cần thiết phải có. Bạn không xác định đường dẫn tương đối liên quan đến thư mục hiện tại của bạn, nhưng với thư mục của liên kết. Đây là những gì bạn đã có sau:ln -s Dropbox/git/codyhess/bin ~/bin
Timo

Ngoài ra @slhck khi ai đó hỏi cụ thể cách tạo liên kết tương đối trong thế giới nào mà một câu nói mà bạn có thể thực hiện liên kết tuyệt đối tạo thành một "giải pháp khả thi"? Nó đặc biệt không trả lời câu hỏi của OP và do đó hoàn toàn ngược lại với giải pháp, đó không phải là giải pháp. Đây không phải là một bình luận cũng không phải là một câu trả lời, nó nên là một câu hỏi "Làm thế nào chính xác các liên kết tương đối hoạt động (giải thích để người dùng mac hiểu nó)?". Tôi hy vọng người dùng mac này giải thích nó đủ tốt. :)
Timo

@TimoLehto Có lẽ bạn muốn gửi bình luận cho tác giả gốc (Cody Hess). Tôi chỉ sao chép bài viết.
slhck

@slhck, tôi đã hướng dẫn nó cho bạn, bởi vì bạn coi giải pháp là "khả thi" và nhận xét của bạn khiến tôi nghĩ rằng bạn sẽ là người thuyết phục nếu muốn gắn cờ câu trả lời là "không phải là câu trả lời" (và nhận được gắn cờ được chấp nhận).
Timo

0

Tôi chỉ muốn giải thích thêm về cách tạo liên kết tượng trưng bằng các đường dẫn tương đối (với một ví dụ chi tiết).

Như Ignacio Vazquez-Abrams đã đề cập trong các bình luận, bạn phải chỉ định vị trí tệp / thư mục liên quan đến nơi tạo liên kết tượng trưng, ​​không liên quan đến thư mục hiện tại của bạn.

THÍ DỤ

Bạn đang ở /usr/share/nginx/html/_src/learn Bạn sẽ tạo một liên kết tượng trưng codingtrong/usr/share/nginx/html

Tạo symlink tương đối (lý thuyết):

sudo ln -s /path/to/source/file-or-folder/relative/from/symlink /path/to/symlink/relative/to/current/location

Tạo symlink tương đối thực tế:

sudo ln -s ./_src/learn/coding ../../coding

Thêm thông tin (ví dụ tương tự)

current path:                                  /usr/share/nginx/html/_src/learn
symlink(to be) relative to current path:       ../../coding                 
symlink location (absolute):                   /usr/share/nginx/html/coding
folder/file relative to symlink location:      ./_src/learn/coding
folder/file absolute path:                     /usr/share/nginx/html/_src/learn/coding  
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.