Tạo một liên kết tượng trưng liên quan đến thư mục hiện tại


110

Tôi đang cố gắng tạo một liên kết tượng trưng trong thư mục nhà của tôi trỏ đến một thư mục trên ổ cứng ngoài của tôi.

Nó hoạt động tốt khi tôi chỉ định nó như thế này:

cd ~
ln -s /run/media/name/exhdd/Data/ Data

Tuy nhiên, nó tạo ra một liên kết bị lỗi khi tôi thử điều này:

cd /run/media/name/exhdd
ln -s Data/ ~/Data

Điều này tạo ra một liên kết mà tôi không thể cdvào.

Khi tôi cố gắng, bash phàn nàn:

bash: cd: Data: Too many levels of symbolic links

Liên kết tượng trưng dữ liệu trong nhà tôi cũng được tô màu đỏ khi lsđược đặt để hiển thị đầu ra màu.

Tại sao chuyện này đang xảy ra? Làm thế nào tôi có thể tạo một liên kết theo cách đó? (Tôi muốn tạo một liên kết tượng trưng đến một thư mục trong thư mục làm việc của tôi trong một thư mục khác.)


Chỉnh sửa: theo câu trả lời StackOverflow này , nếu đối số thứ hai (trong trường hợp của tôi là ~ / Dữ liệu) đã tồn tại và là một thư mục, lnsẽ tạo một liên kết tượng trưng đến mục tiêu bên trong thư mục đó.

Tuy nhiên, tôi đang gặp vấn đề tương tự với:

ln -s Data/ ~/

7
Chỉ là một mẹo ngẫu nhiên: cd ~thường giống như cd.

3
ls -l ~/Datasẽ giúp bạn thấy những gì đã xảy ra với liên kết "màu đỏ".
msw

Hừm, không biết rằng tôi có thể làm điều đó, cảm ơn. Tôi nhớ đã cố gắng cat, nhưng tôi quên mất kết quả là gì ... (Tôi không ở nhà vào lúc này.)
jcora

Lưu ý bên cạnh, giả sử bạn chỉ muốn tạo một liên kết tượng trưng của tất cả các tệp, thư mục và thư mục con trong một thư mục cụ thể, giả sử, tất cả các mục bên trong /run/media/name/exhdd/Data/để Datasau đó sử dụng thông tin sauln -s /run/media/name/exhdd/Data/* Data
user2555595

Câu trả lời:


115

Đây là những gì đang xảy ra. Nếu bạn tạo một liên kết tượng trưng với một đường dẫn tương đối, liên kết tượng trưng sẽ tương đối. Symlinks chỉ lưu trữ các đường dẫn mà bạn cung cấp cho họ. Họ không bao giờ giải quyết các đường dẫn đến các đường dẫn đầy đủ. Đang chạy

$ pwd
/usr/bin
$ ln -s ls /usr/bin/ls2

tạo ra một liên kết tượng trưng có tên ls2trong /usr/binđể ls(tức. /usr/bin/ls) liên quan đến các thư mục mà các liên kết tượng trưng là trong ( /usr/bin). Lệnh trên sẽ tạo một symlink chức năng từ bất kỳ thư mục nào.

$ pwd
/home/me
$ ln -s ls /usr/bin/ls2

Nếu bạn di chuyển symlink sang một thư mục khác, nó sẽ ngừng trỏ đến tệp tại /usr/bin/ls.

Bạn đang tạo một liên kết tượng trưng để trỏ đến Datavà đặt tên cho nó Data. Nó đang chỉ vào chính nó. Bạn phải tạo một liên kết tượng trưng với đường dẫn tuyệt đối của thư mục.

ln -s "$(realpath Data)" ~/Data

14

Tôi đã có cùng một vấn đề. Google đã dẫn đến câu trả lời này nhưng giải pháp đơn giản nhất không được ghi lại ở đây:

ln -sT 

-T thực hiện các mẹo

người đàn ông

-T, --no-target-directory
    treat LINK_NAME as a normal file always

Chỉ cần thêm điều này vào đây để bất cứ ai có cùng câu hỏi có thể tìm thấy điều này :)


9

lnHành vi của những người có đường dẫn tương đối là không trực quan. Để khôi phục sự tỉnh táo, sử dụng -rcờ.

cd /run/media/name/exhdd
ln -sr Data/ ~/Data

Giải trình:

   -r, --relative
          create symbolic links relative to link location

Điều đó có nghĩa là lnsẽ làm những gì bạn mong đợi. Nó sẽ tính đến thư mục bạn đang ở, thư mục đích nằm trong thư mục nào và xây dựng một đường dẫn liên quan đến thư mục mà liên kết sẽ ở. Hành vi mặc định (không có -r) là diễn giải tham số đầu tiên (đích) theo nghĩa đen , trong trường hợp nào bạn phải tự xây dựng đường dẫn để nó hợp lệ tại thư mục của liên kết.

Hoặc, sử dụng một đường dẫn tuyệt đối, như được đề cập bởi @SmithJohn

ln -s "$(realpath Data)" ~/Data #bash shell

hoặc là

ln -s "(realpath Data)" ~/Data #fish shell

-1

Rất đơn giản, bạn có thể tạo liên kết cho một thư mục. Nhìn lệnh của tôi

ln -s / home / targatedfolder / var / www / html / link_name

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.