Tại sao liên kết tượng trưng của tôi không hoạt động?


24

Tôi đang cố gắng để hiểu rõ hơn các liên kết tượng trưng ... và không gặp nhiều may mắn. Đây là đầu ra shell thực tế của tôi với tên người dùng / máy chủ đã thay đổi:

username@host:~$ mkdir actual
username@host:~$ mkdir proper
username@host:~$ touch actual/file-1.txt
username@host:~$ echo "file 1" > actual/file-1.txt
username@host:~$ touch actual/file-2.txt
username@host:~$ echo "file 2" > actual/file-2.txt
username@host:~$ ln -s actual/file-1.txt actual/file-2.txt proper
username@host:~$ # Now, try to use the files through their links
username@host:~$ cat proper/file-1.txt
cat: proper/file-1.txt: No such file or directory
username@host:~$ cat proper/file-2.txt
cat: proper/file-2.txt: No such file or directory
username@host:~$ # Check that actual files do in fact exist
username@host:~$ cat actual/file-1.txt
file 1
username@host:~$ cat actual/file-2.txt
file 2
username@host:~$ # Remove the links and go home :(
username@host:~$ rm proper/file-1.txt
username@host:~$ rm proper/file-2.txt

Tôi nghĩ rằng một liên kết tượng trưng được cho là hoạt động trong suốt, theo nghĩa là bạn có thể vận hành trên tệp mà nó trỏ đến như thể bạn đang truy cập trực tiếp vào tệp (tất nhiên trong trường hợp rmtất nhiên là liên kết bị xóa ).


Đĩa của bạn được định dạng như thế nào? Bạn đang sử dụng hệ thống tập tin nào? (FAT không hỗ trợ liên kết tượng trưng nhưng nếu bạn cố gắng tạo hệ thống tệp FAT, nó sẽ báo lỗi.)
Nicole Hamilton

@Nicole Hamilton - Đó là ext4 (theo df -T) - kết quả trên có lạ với bạn không?
orokusaki

@orokusaki Không lạ. Xem câu trả lời của tôi dưới đây. Chỉ cần ngẩng cao đầu, không cần phải chạm vào các tập tin để gửi cho họ. Họ không cần phải tồn tại ngay cả. Chỉ để tiết kiệm cho bạn một số gõ!
nerdwaller

Câu trả lời:


50

Các liên kết có xu hướng thích các đường dẫn đầy đủ hoặc liên quan đến liên kết, nếu không, chúng thường có thể được tìm kiếm file-1.txtcục bộ (đủ kỳ lạ).

Điều hướng đến propervà thực hiện ls -lvà bạn có thể thấy rằng symlink đang tìm kiếm actual/file-1.txt, khi nào nó nên ../actual/file-1.txt.

Vì vậy, bạn có hai lựa chọn:

  1. Đưa ra con đường đầy đủ

    ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper
  2. Điều hướng đến thư mục bạn muốn liên kết được vào và liên kết từ đó

    cd proper
    ln -s ../actual/file-1.txt ../actual/file-2.txt ./

Chỉnh sửa : Một gợi ý để lưu gõ.

Bạn chỉ có thể làm ln -s ~/actual/file-{1,2}.txt ~/proper

Các mục trong dấu ngoặc nhọn được thay thế và đặt cạnh nhau, tạo ra lệnh

ln -s ~/actual/file-1.txt ~/actual/file-2.txt ~/proper

liên kết cả hai tập tin vào thư mục đích. Lưu một số gõ chính khi bạn nhận được thêm trong vỏ.


2
Cảm ơn - Tôi vừa định nhổ tóc trước khi đọc câu trả lời của bạn.
orokusaki

1
Đôi khi thật khó hiểu! Linux có xu hướng rất chính xác, vì vậy nếu bạn nói hãy làm điều gì đó - nó sẽ. Hãy cẩn thận với các thư mục liên kết theo cách đó, tôi đã ghi đè lên một hoặc hai trước đó (Chỉ cần chỉ định tên mà không có dấu gạch chéo). Ngoài ra, không rm -rf *vào thư mục symlinked - bạn có thể xóa thư mục mà nó liên kết đến. Chỉ cần làm symlinkname rm. Chỉ một vài điều tôi đã phạm sai lầm trên: D
nerdwaller

3

Vấn đề là việc sử dụng các đường dẫn tương đối. Nếu bạn chỉ định tạo liên kết của mình với đường dẫn rõ ràng đầy đủ, nó sẽ hoạt động.

$ ln -s ~ / thực tế / file1.txt ~ / thực tế / file2.txt ~ / thích hợp /

$ cat đúng / file1.txt

tập tin 1

$

Ví dụ của bạn tạo các liên kết trong properđó tìm kiếm một thư mục con có tên thực tế trong thư mục hiện tại, thay vì cha mẹ dự định của cả hai.


1

Liên kết tượng trưng có thể là khó khăn. Về bản chất, một liên kết tượng trưng là một tệp chứa tên tệp / tên đường dẫn cho một tệp khác (và được gắn cờ để xử lý đặc biệt). Nếu tên đường dẫn trong tệp liên kết bắt đầu bằng ' /', thì nó được coi là tên đường dẫn tuyệt đối và mọi thứ khá đơn giản. Nếu nó không bắt đầu bằng dấu gạch chéo, nó được coi là tên đường dẫn tương đối - liên quan đến thư mục chứa liên kết. (Điều này đúng cho dù tên đó có chứa dấu gạch chéo hay không.) Vì vậy, bạn đã tạo proper/file–1.txtnhư một liên kết đến actual/file–1.txtĐiên, và khi bạn cố truy cập nó, hệ thống đã cố gắng truy cập proper/actual/file–1.txt. Bạn nên nói

ln s  ../actual/file1.txt  ../actual/file2.txt  proper

Nhân tiện, bạn không cần các touchlệnh.  echo "file 1" > actual/file–1.txtlà đủ để tạo ra actual/file–1.txt.


0

Một vấn đề có liên quan và có thể rõ ràng với nhiều người, nhưng đã làm tôi bối rối trong vài phút: nếu bạn đang tạo một liên kết tượng trưng trong một thư mục được liên kết với nhau, hoặc có một liên kết tượng trưng trong đường dẫn của thư mục làm việc hiện tại, bạn có thể chạy vào các vấn đề với các liên kết tượng trưng không hoạt động.

Sử dụng cd ..ls -llặp đi lặp lại, để xem các thư mục mẹ của bạn có được liên kết với nhau không.

Nếu bạn cần tạo một liên kết tượng trưng, cdđến thư mục Target gốc và tạo các liên kết tượng trưng mới ở đó, vì vậy các đường dẫn tương đối là chính xác.

Hoặc nói cách khác: đường dẫn tương đối là từ Nguồn gốc đến Đích. Nếu Nguồn gốc sau đó được liên kết với nhau, điều đó không sao cả. Nhưng bạn có thể gặp phải các vấn đề khi thiết lập một link_name Origin mới trong một thư mục mà chính nó được liên kết bằng cách nào đó.


1
Thay vì " cd ..ls -llặp đi lặp lại", bạn có thể sử dụng namei -mox $PWD. Một cách hữu ích khác để tìm hiểu xem có liên kết tượng trưng nào trên đường dẫn hay không pwd -P, nó cung cấp cho bạn đường dẫn đến thư mục hiện tại không chứa bất kỳ liên kết tượng trưng nào (vì vậy nếu pwdpwd -Pđưa ra đầu ra khác nhau, bạn sẽ biết có một liên kết tượng trưng ở đâu đó trên đường đi ).
Ansa211

0

Khi bạn cố gắng tạo một liên kết đến một tệp không tồn tại (hoặc bạn đã đưa ra đường dẫn không chính xác) tôi sẽ không gặp lỗi. Nó tạo ra một liên kết nhưng khi bạn thử 'cat' trên liên kết đó thì nó báo không tìm thấy tập tin nào. Ngay cả khi bạn có thể nhìn thấy nó bằng ls. Trong những trường hợp như vậy luôn luôn kiểm tra lại đường dẫn tệp của bạn.

ubuntu@ip-172-31-80-155:~/lab5$ ln -s etc/ufw/ufw.conf link1
ubuntu@ip-172-31-80-155:~/lab5$ ls -al
total 5360
drwxrwxr-x 2 ubuntu ubuntu    4096 Mar  9 18:56 .
drwxr-xr-x 7 ubuntu ubuntu    4096 Mar  9 18:42 ..
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link1
cat: link1: No such file or directory

Bởi vì tập tin etc / ufw / ufw.conf không tồn tại. Đường dẫn đúng là /etc/ufw/ufw.conf

ubuntu@ip-172-31-80-155:~/lab5$ ln -s /etc/ufw/ufw.conf link2
ubuntu@ip-172-31-80-155:~/lab5$ ls -l
total 5352
-rwxr--r-- 1 ubuntu ubuntu 5478400 Mar  9 18:32 backup.tar
lrwxrwxrwx 1 ubuntu ubuntu      16 Mar  9 18:56 link1 -> etc/ufw/ufw.conf
lrwxrwxrwx 1 ubuntu ubuntu      17 Mar  9 19:00 link2 -> /etc/ufw/ufw.conf
ubuntu@ip-172-31-80-155:~/lab5$ cat link2
# /etc/ufw/ufw.conf
#

# Set to yes to start on boot. If setting this remotely, be sure to add a rule
# to allow your remote connection before starting ufw. Eg: 'ufw allow 22/tcp'
ENABLED=no

# Please use the 'ufw' command to set the loglevel. Eg: 'ufw logging medium'.
# See 'man ufw' for details.
LOGLEVEL=low

Đã có một câu trả lời tốt hơn, và phần đầu tiên, rằng ln -s"đôi khi" không kiểm tra sự tồn tại của mục tiêu là sai.
RalfFriedl
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.