Tôi cần một symlink giải quyết liên quan đến thư mục mà nó được đặt. Lệnh nào được sử dụng để tạo ra một thứ như vậy?
Tôi cần một symlink giải quyết liên quan đến thư mục mà nó được đặt. Lệnh nào được sử dụng để tạo ra một thứ như vậy?
Câu trả lời:
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.
ln -s ../some/other/file /some/dir/linkname
ln -s ./file linkname
kể từ khi .
đề cập đến thư mục hiện tại.
ln -s somedir/original-dir link-name
không hoạt động. Nó tạo ra một thư mục có tên link-name
chứ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
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 -s
bằ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.
-r
tù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.
ln -r -s targetfile myalias
có thể giúp bạn khắc phục nó
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/../poo
tồ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.
<
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ể đó.
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
ln -s Dropbox/git/codyhess/bin ~/bin
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 coding
trong/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