Tạo một liên kết tượng trưng trong bash với hai đường dẫn tương đối


2

Tôi có hai thư mục trong nhà của mình: ~/dir1~/dir2với một tập tin đầu tiên: ~/dir1/file.txtCó cách nào tôi có thể tạo một liên kết tượng trưng đến nó ~/dir2mà không chuyển đến ~/và nếu không thì tại sao lại như vậy?

Tôi đã thử ~/chạy:

$ ln -s ./dir1/file.txt ./dir2/file.txt

nhưng như tôi mong đợi, điều đó làm cho liên kết tượng trưng kết quả chỉ ra một cách hiệu quả ~/dir1/dir2/file.txt, điều đó có ý nghĩa nhưng không phải là điều tôi thực sự muốn.

Tôi cũng đã thử:

$ ln -s ./dir1/file.txt ../dir2/file.txt

Trả về:

ln: failed to create symbolic link `../dir2/file.txt': No such file or directory

Tôi hy vọng điều này sẽ tạo ra một liên kết tượng trưng ~/dir2/file.txtchỉ đến~/../dir1/file.txt

Vì vậy, tôi cho rằng câu hỏi thực sự của tôi là: tôi có thể buộc lntạo một liên kết tượng trưng đến một tệp mà nó không nghĩ là tồn tại không?

Chỉnh sửa: Để rõ hơn về những gì tôi đang cố gắng đạt được, tôi muốn một lệnh duy nhất mà tôi có thể chạy từ thư mục chính của mình sẽ thực hiện một cách hiệu quả:

pushd dir2/ && ln -s ../dir1/file.txt && popd

hoặc trong Python (đây là lần gần nhất tôi đến với những gì tôi muốn):

echo "import os; os.symlink('../dir1/file.txt', './dir2/file.txt')" | python

Câu trả lời:


2

Bạn có thể làm một trong hai

  1. Sử dụng đường dẫn tuyệt đối

    $ ln -s ~/dir1/file.txt ~/dir2
    $ readlink dir2/file.txt 
    /home/terdon/dir1/file.txt
    
  2. Sử dụng các đường dẫn tương đối đúng

    $ ln -s ../dir1/file.txt dir2/
    $ readlink dir2/file.txt 
    ../dir1/file.txt
    

Tùy thuộc vào trường hợp sử dụng của bạn, cái này có thể tốt hơn cái kia. Chỉ cần nhớ rằng khi tạo liên kết bằng các đường dẫn tương đối, các đường dẫn phải tương đối với mục tiêu và không liên quan đến vị trí hiện tại của bạn.


Cảm ơn câu trả lời của bạn. Đề xuất đầu tiên của bạn sẽ hoạt động nếu tôi có đường dẫn tuyệt đối nhưng tôi đặc biệt quan tâm đến đường dẫn tương đối. Đề xuất thứ hai của bạn đồng nghĩa với lệnh đã thử thứ hai của tôi (thiếu tên tệp đích) nhưng tôi nhận được một tệp không tìm thấy lỗi (xem ở trên) trong đối số đầu tiên . Tôi có thể hỏi phân phối linux nào bạn đang sử dụng không?
nettux

@ nettux443 huh, thật lạ. Tôi đang dùng LMDE (về cơ bản là kiểm tra Debian) và bash 4.2.45. Lưu ý rằng đề nghị thứ hai của tôi không giống như của bạn. Bạn đã sử dụng ./dirvà tôi đang sử dụng ../dir. Ý tưởng là đường dẫn cần phải tương đối với mục tiêu. Nếu bạn muốn bao gồm tên của liên kết, hãy sử dụng ln -s ../dir1/file.txt ~/dir2/foonó vẫn hoạt động. Nó cũng sẽ làm việc bất kể bạn đang ở đâu. Tôi vừa thử ở trên /etcvà nó đã tạo chính xác một tệp khi ~/dir2/footrỏ đến ~/dir1/file.txt.
terdon

@ nettux443 không, lnchỉ kiểm tra xem tệp mà nó tạo có tồn tại không. Đó là công việc của bạn để đảm bảo rằng mục tiêu là có thật. Điều này sẽ không có lỗi, ví dụ: ln -s /fruble/bargle/bob /tmp/foonó sẽ vui vẻ và âm thầm tạo ra một liên kết bị hỏng.
terdon

Xin lỗi bạn đúng câu trả lời thứ hai của tôi không giống như đề nghị của bạn. Trong đó có vấn đề. Đề nghị của bạn là những gì tôi muốn thử .... hy vọng sẽ không phạm sai lầm đó một lần nữa!
nettux

@ nettux443 lol, xảy ra với những người giỏi nhất trong chúng ta :)
terdon

2

Câu hỏi của bạn hơi khó hiểu.

  1. Bạn hỏi "Có cách nào để tôi có thể tạo liên kết tượng trưng cho nó từ ~/dir1[...] không?" Tôi cho rằng bạn có nghĩa là "từ ~/dir2", dựa trên phần còn lại của bài viết của bạn?

  2. Lệnh đầu tiên của bạn

    $ ln -s ./dir1/file.txt ./dir2/file.txt

    không làm những gì bạn nghĩ nó làm. Giả sử bạn vẫn còn trong thư mục chính của mình, lệnh trên sẽ tạo một liên kết tượng trưng có đường dẫn riêng ~/dir2/file.txtvà liên kết tượng trưng này chỉ theo nghĩa đen với đường dẫn ./dir1/file.txt. Bởi vì symlink đã nói nằm trong thư ~/dir2mục, đường dẫn đích như vậy sẽ phân giải thành ~/dir2/./dir1/file.txt, nó tiếp tục phân giải thành ~/dir2/dir1/file.txt(có thể không tồn tại và không phải là những gì bạn muốn). Vì vậy, tôi nghi ngờ tại sao bạn nói nó giải quyết ~/dir1/dir2/file.txt.

  3. Lệnh thứ 2 của bạn không thành công vì không có thư mục ../dir2để đặt symlink và đó là thông báo lỗi.

  4. Trả lời câu hỏi của bạn, đúng vậy. HĐH không quan tâm liệu symlink của bạn có trỏ đến một đường dẫn không có đối tượng hệ thống tập tin hợp lệ hay không.

Có lẽ những gì bạn thực sự muốn là một cái gì đó như

ln -s ../dir1/file.txt ./dir2/file.txt

Tôi đoán? Lệnh này tạo một liên kết tượng trưng có đường dẫn riêng ./dir2/file.txtvà mục tiêu của nó là đường dẫn tương đối theo nghĩa đen ../dir1/file.txt. Đường dẫn cuối cùng, tuyệt đối được chỉ ra bởi symlink là ~/dir2/../dir1/file.txt, nó được giải quyết ~/dir1/file.txt.

Lưu ý rằng ~biểu tượng là một ký tự có thể mở rộng shell mở rộng đến đường dẫn tuyệt đối của thư mục chính của bạn. ~-Phát triển không phải là một phần của độ phân giải đường dẫn hệ điều hành.

Cách đọc được đề nghị

Linux manpages của path_resolution(7), symlink(7), ln(1)ln(1p).

Biên tập

Làm rõ & đề nghị đọc.


Tôi hiểu lý do tại sao lệnh đầu tiên của tôi không hoạt động, mà tôi không mong đợi để làm việc nhưng tôi nghĩ tôi sẽ thử nó. Lệnh thứ hai tôi cảm thấy sẽ hoạt động nếu tôi có thể buộc nó tạo liên kết. Lưu ý các đối số của lệnh được đề xuất là vòng sai. ln -s /path/to/file /path/to/new/linklệnh bạn đã viết đang cố gắng tạo một liên kết ~/dir1/file.txttrỏ tới ~/dir2/file.txt(ngược !!) :)
nettux

xem câu hỏi đã chỉnh sửa của tôi để biết thêm thông tin chi tiết về những gì tôi đang cố gắng đạt được.
nettux
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.