Quá nhiều cấp độ liên kết tượng trưng


100

Tôi đã tạo cấu trúc tệp này:

test/src
test/firefox

Khi tôi chạy lệnh này:

ln -s test/src test/firefox

Tôi sẽ mong đợi một liên kết tượng trưng test/firefox/srcđược tạo ra trỏ đến test/src, tuy nhiên tôi nhận được lỗi này:

-bash: cd: src: Too many levels of symbolic links
  • Tôi đang làm gì sai?
  • Bạn không thể tạo một liên kết tượng trưng đến một thư mục được lưu trữ trong anh chị em của thư mục đó?
  • Điểm này là gì?

Tôi không chắc chắn tôi làm theo những gì bạn đã làm. Vui lòng gửi đầu ra ls -ld test test/*hoặc chuỗi lệnh chính xác mà bạn đã chạy để tạo các tệp này.
Gilles

thử nghiệm mkdir; kiểm tra mkdir / src; thử nghiệm mkdir / firefox; ln -s test / src test / firefox
David Zorychta

Với các lệnh này, cd test/firefox/srcsẽ hiển thị lỗi cd: no such file or directory: test/firefox/src, bởi vì test/firefox/srclà một liên kết tượng trưng lơ lửng. Bạn đang chạy cdtrên một số liên kết tượng trưng khác được gọi là src?
Gilles

Tôi chắc chắn rằng bạn đã làm một cái gì đó giữa ln -scdmà bạn không nói với chúng tôi. Giả sử rằng chỉ có một testthư mục con trong thư mục hiện tại của bạn, một cd src(hoặc bất cứ điều gì bạn đã thực hiện) sẽ gây ra lỗi. Bạn đã đặt một cái gì đó vào test/firefox?
Dubu

5
Và như @Gilles đã đưa ra một gợi ý, liên kết đó sẽ không làm những gì bạn nghĩ. Liên kết tượng trưng với các mục tiêu tương đối luôn liên quan đến thư mục symlink , không phải thư mục mà bạn đã tạo liên kết. Vì vậy, là trong một thư mục /some/path, một ln -s test/src test/firefoxsẽ tạo ra một liên kết tượng trưng chỉ từ /some/path/test/firefox/srcđể /some/path/test/firefox/test/src, không để /some/path/test/src.
Dubu

Câu trả lời:


32

Bề ngoài, những gì bạn đã đề nghị bạn đã thử làm việc cho tôi.

Thí dụ

$ mkdir -p test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    `-- [drwxrwxr-x]  ./test/src

Tạo liên kết tượng trưng:

$ ln -s test/src test/firefox

$ tree --noreport -fp
.
`-- [drwxrwxr-x]  ./test
    |-- [drwxrwxr-x]  ./test/firefox
    |   `-- [lrwxrwxrwx]  ./test/firefox/src -> test/src
    `-- [drwxrwxr-x]  ./test/src

Chạy nó lần thứ 2 thường sẽ tạo ra điều này:

$ ln -s test/src test/firefox
ln: failed to create symbolic link ‘test/firefox/src’: File exists

Vì vậy, bạn có thể có một cái gì đó khác đang diễn ra ở đây. Tôi nghi ngờ rằng bạn có một tham chiếu tròn trong đó một liên kết đang quay trở lại chính nó.

Bạn có thể sử dụng findđể điều chỉnh điều này một chút:

$ cd /suspected/directory
$ find -L ./ -mindepth 15

2
find -L ./ -mindepth 15tiết lộ thủ phạm
user7610

167

Như Dubu chỉ ra trong một bình luận, vấn đề nằm ở đường dẫn tương đối của bạn. Tôi gặp vấn đề tương tự liên kết cấu hình nginx của tôi từ /usr/local/etc/nginxđến /etc/nginx. Nếu bạn tạo symlink như thế này:

cd /usr/local/etc
ln -s nginx/ /etc/nginx

Thực tế bạn sẽ tạo liên kết / etc / nginx -> / etc / nginx, vì đường dẫn nguồn có liên quan đến đường dẫn của liên kết. Giải pháp đơn giản như sử dụng các đường dẫn tuyệt đối:

ln -s /usr/local/etc/nginx /etc/nginx

57
Câu trả lời này rõ ràng hơn câu trả lời khác. "Sử dụng đường dẫn tuyệt đối."
wulftone

1
Tôi có thể xác nhận rằng điều này làm việc cho tôi trên Windows bằng cách sử dụng cygwin. Cảm ơn!
dimiguel

Tôi thường có vấn đề nhận được các đối số chính xác. Trên OSX và GNU Linux, chúng bị đảo ngược khiến tôi càng bối rối hơn.
Daniel W.

Tôi vẫn không thể tin điều này hoạt động.
PNDA

5
Bạn có thể sử dụng các liên kết tương đối , nhưng chúng nên được dựa trên thư mục chứa liên kết tượng trưng . Nói cách khác: đối số đầu tiên phải giống như bạn sẽ viết saucd nếu bạn muốn đến thư mục được nhắm mục tiêu từ thư mục chứa tệp của liên kết tượng trưng.
totymedli

9

Symlinks liên quan đến thư mục mẹ của liên kết, không phải là thư mục hiện tại của lnquá trình.

Khi bạn làm:

cd /top/dir
ln -s test/src test/firefox

(nơi test/firefoxlà một thư mục), bạn đang tạo một test/firefox/srcliên kết tượng trưng có mục tiêu test/src.

Điều đó test/srccó liên quan đến test/firefoxthư mục, vì vậy đó là một liên kết tượng trưng đến /top/dir/test/firefox/test/src.

Nếu bạn muốn liên kết tượng trưng đó là một liên kết đến /top/dir/test/src, bạn cần viết:

ln -s ../src test/firefox/

Hoặc là

ln -s /top/dir/test/src test/firefox/

mặc dù nói chung là một ý tưởng tồi để tạo liên kết tượng trưng đến các đường dẫn tuyệt đối vì chúng dễ bị phá vỡ khi các thư mục được đổi tên hoặc hệ thống tập tin được gắn ở nơi khác.

Với GNU ln, bạn có thể sử dụng -rtùy chọn của nó để cho phép nó tự tính toán:

$ ln -rs test/src test/firefox/
$ ls -ld test/firefox/src
lrwxrwxrwx 1 chazelas chazelas 6 Nov 29 15:59 test/firefox/src -> ../src

5

Sử dụng đường dẫn tuyệt đối thay vì đường dẫn tương đối, sau đó nó sẽ hoạt động.

Ví dụ:

ln -s /home/user/test/src /home/user/test/firefox

0

Câu trả lời là sử dụng đường dẫn tuyệt đối. Nhưng nó có thể gây khó chịu khi gõ đường dẫn đầy đủ cho một cái gì đó trong thư mục hiện tại. Bạn có thể sử dụng thay thế lệnh của pwd để tránh điều đó. Nếu mục tiêu của bạn nằm trong thư mục hiện tại:

ln -s "$(pwd)"/target abs/path/to/link 

Nếu liên kết của bạn phải nằm trong thư mục hiện tại:

ln -s /abs/path/to/target "$(pwd)"
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.