Làm thế nào để ghi đè / cập nhật một liên kết tượng trưng?


188

Tôi đang cố gắng sử dụng các liên kết tượng trưng. Tôi đã đọc và tìm thấy các lệnh sau:

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}
Deletion -> rm {link-name}

Sáng tạo và xóa hoạt động tốt. Nhưng cập nhật không hoạt động. Sau khi thực hiện lệnh này, symlink trở nên không hợp lệ.

Tôi đã đọc ở đây và ở đó rằng không thể cập nhật / ghi đè một liên kết tượng trưng. Vì vậy, có thông tin mâu thuẫn trên mạng. Ai đúng? Nếu một liên kết tượng trưng có thể được cập nhật / ghi đè, làm thế nào tôi có thể đạt được điều này?

Cập nhật

Đây là cấu trúc thư mục của tôi:

~/scripts/test/
~/scripts/test/remote_loc/
~/scripts/test/remote_loc/site1/
~/scripts/test/remote_loc/site1/stuff1.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site2/stuff2.txt
~/scripts/test/remote_loc/site2/
~/scripts/test/remote_loc/site3/stuff3.txt

Từ ~/scripts/test/khi tôi thực hiện:

ln -s /remote_loc/site1 test_link

a test_linkđược tạo ra, và tôi có thể làm được ls -l, nhưng nó dường như bị hỏng (trái với những gì tôi đã nói ở trên trong câu hỏi của tôi).

Làm thế nào tôi có thể thực hiện một liên kết cấp thư mục?


1
Tôi khuyên bạn nên sử dụng unlinkthay vì rm. Với unlinkbạn không bao giờ có nguy cơ mất bất kỳ tập tin trong một thư mục nguồn bằng cách vô tình sử dụng các công tắc sai.
Jpsy

Bạn đang sử dụng lệnh hàng đầu / trong lệnh của mình
Jamie Cook

@jpsy lời khuyên của bạn về unlink sẽ rất tốt, nếu đó là sự thật . Hãy thử chạm zzzz; bỏ liên kết zzzz. (hủy liên kết cuộc gọi, hủy liên kết giống như rm, nhưng không có tùy chọn ưa thích và không có đệ quy).
ctrl-alt-delor

Tại sao sử dụng -n? (có thể là vấn đề). Ngoài ra nếu ln của bạn hỗ trợ -tthì hãy sử dụng nó, cho những trường hợp này và -Thoặc destination/cho những trường hợp khác.
ctrl-alt-delor

Câu trả lời:


150

Sử dụng -fvới lnsẽ ghi đè lên bất kỳ liên kết nào đã có, miễn là bạn có quyền chính xác, nó sẽ hoạt động ... Nó luôn hoạt động với tôi. Bạn đang sử dụng hệ điều hành nào?


Tôi đã cập nhật câu hỏi của tôi với nhiều thông tin hơn về vấn đề của tôi.
Jérôme Verstrynge

Tôi thuộc linux.
Jérôme Verstrynge

2
Nếu bạn chuyển đổi các lntham số, như tôi thường làm, thì công -ftắc có phá hủy các tệp hiện có của bạn (mục tiêu liên kết) không? Trong cả hai trường hợp, chúng tôi cũng có -itham số (sẽ nhắc người dùng ghi đè), nếu bạn muốn bảo mật một chút.
palswim

2
@palswim Bài đăng SO này ngụ ý nó an toàn vì -fchỉ cần gọi unlink()link()dưới mui xe: stackoverflow.com/a/1466570/157385 . Dù vậy, tôi ước mình chỉ nhớ đúng thứ tự!
Mike Branski

4
Không hoạt động. Nhu cầu -n. Xem câu trả lời được chấp nhận.
Shawn Welch

119

Ok, tôi đã tìm thấy lỗi của mình ở đâu: người ta không nên đặt đầu tiên /vào đường dẫn.

Nói cách khác, các lệnh trong câu hỏi của tôi phải là:

Creation -> ln -s {path/to/file-name} {link-name}
Update -> ln -sfn {path/to/file-name} {link-name}

thay vì

Creation -> ln -s {/path/to/file-name} {link-name}
Update -> ln -sfn {/path/to/file-name} {link-name}

xem xét trường hợp của tôi.


22
Đối với một số thông tin bổ sung về lý do tại sao, sự khác biệt là một relativeđường dẫn (không có đường dẫn /) và absoluteđường dẫn khác là đường dẫn (với đường dẫn /). Nếu bạn đang quản trị một hệ thống Linux, điều quan trọng là bạn hiểu được sự khác biệt. Chẳng hạn, sự khác biệt giữa rm -rf ./*rm -rf /.*quyết định bạn có giữ công việc của mình hay không :)
Safado

5
Điều này không trả lời câu hỏi 'làm thế nào để cập nhật / ghi đè một liên kết sym'
Sirch

Dòng ln -sfn {path / to / file-name} {link-name} hiện.
Jérôme Verstrynge

6
-n (--no-dereference) làm cho nó xử lý {tên liên kết} như một tệp bình thường thay vì theo liên kết. Cho rằng bạn cần phải hoạt động trên liên kết đó không theo nó, bạn phải sử dụng tùy chọn này.
feldoh

1
Câu trả lời này phải là câu trả lời nổi bật với -ntham số để thay thế liên kết biểu tượng.
Nick Tsai

12

Vấn đề đầu tiên:

Trích dẫn bạn:

Sáng tạo và xóa hoạt động tốt. Nhưng cập nhật không hoạt động. Sau khi thực hiện lệnh này, symlink trở nên không hợp lệ.

Vấn đề với cấu trúc thư mục đã cho:

~ / scripts / test / ~ / scripts / test / remote_loc / ~ / scripts / test / remote_loc / site1 / ~ / scripts / test / remote_loc / site1 / Stuff1.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts /test/remote_loc/site2/ ware2.txt ~ / scripts / test / remote_loc / site2 / ~ / scripts / test / remote_loc / site3 / Stuff3.txt

và sử dụng lệnh:

ln -s /remote_loc/site1 test_link

Có phải nó tạo ra một liên kết tượng trưng trong $ PWD của bạn, hoặc thư mục làm việc hiện tại, trỏ đến một tệp không tồn tại ngoài /, hoặc root, tại / remote_loc / site1

Nếu PWD của bạn ở ~ / scripts / thì bạn nên sử dụng cái này:

ln -s remote_loc/site1 test_link

khác bạn có thể đã sử dụng đường dẫn tuyệt đối đầy đủ như:

ln -s /home/yourusername/remote_loc/site1 test_link

Vấn đề thứ hai:

Trích dẫn bạn:

Tôi đã đọc ở đây và ở đó rằng không thể cập nhật / ghi đè một liên kết tượng trưng. Vì vậy, có thông tin mâu thuẫn trên mạng. Ai đúng? Nếu một liên kết tượng trưng có thể được cập nhật / ghi đè, làm thế nào tôi có thể đạt được điều này?

Để trả lời câu hỏi của bạn "Ai đúng", tôi không chắc chính xác những gì bạn đã đọc, hoặc nó được hiểu như thế nào. Nhưng, những điều sau đây sẽ giúp làm sáng tỏ:

  1. Những gì có thể được cập nhật, và
  2. Những gì không thể được cập nhật mà không sử dụng các công tắc thích hợp.


Cập nhật các liên kết tượng trưng với các mục tiêu không phải là thư mục.

ln -sf:
-f hoặc --force xóa các tệp đích hiện có, Cái này được sử dụng để cập nhật đích hoặc đích của liên kết.

Thí dụ:

 ln -sf /tmp/test /tmp/test.link; ls -go /tmp |grep test
 -rw-r--r-- 1    0 Jun  8 17:19 test
 lrwxrwxrwx 1    9 Jun  8 17:27 test.link -> /tmp/test

Nhưng, như bạn có thể thấy, nó sẽ đưa ra đường dẫn tuyệt đối nếu các đường dẫn tuyệt đối nằm trong lncác đối số. Đưa ra một đường dẫn đầy đủ là cần thiết khi thư mục làm việc hiện tại khác với thư mục mẹ của liên kết.


Đường dẫn tương đối:

ln -sfr:
-r hoặc --relative tạo các liên kết tượng trưng liên quan đến vị trí của liên kết.

Thí dụ:

ln -sfr /tmp/test  /tmp/test.link  ; ls -go /tmp| grep test
-rw-r--r-- 1    0 Jun  8 17:19 test
lrwxrwxrwx 1    4 Jun  8 17:27 test.link -> test

Nhưng, cập nhật một liên kết đến một thư mục sẽ không hoạt động nếu mục tiêu là một thư mục.

Thí dụ:

ln -sf /tmp/testdir  /tmp/testdir.link  ; ls -go /tmp  |grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:47 testdir.link -> testdir

Như bạn có thể thấy, mặc dù sử dụng tên đường dẫn tuyệt đối được đưa ra trong lnđối số ở trên mà không có tùy chọn -r, liên kết tượng trưng vẫn liên quan đến liên kết.


Cập nhật Liên kết đến Thư mục:

ln -sfrn:
-n hoặc --no-dereference coi LINK_NAME là một tệp bình thường nếu đó là một liên kết tượng trưng đến một thư mục.

Thí dụ:

ln -sfn /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1   12 Jun  8 17:48 testdir.link -> /tmp/testdir

Ngược lại với:

ln -sfnr /tmp/testdir /tmp/testdir.link; ls -go /tmp| grep testdir
drwxr-xr-x 2 4096 Jun  8 17:48 testdir
lrwxrwxrwx 1    7 Jun  8 17:48 testdir.link -> testdir

6
$ touch test1 test2
$ ln -sf test2 test1
$ ls -l test[12]
lrwxrwxrwx 1 user01 user01 5 2012-05-17 14:41 test1 -> test2
-rw-r--r-- 1 user01 user01 0 2012-05-17 14:41 test2

Khi tôi thực hiện kiểm tra với 1 cấp thư mục, nó hoạt động, nhưng tôi đang cố gắng sử dụng các thư mục đa cấp, và nó không hoạt động. Tôi đã cập nhật câu hỏi của tôi.
Jérôme Verstrynge
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.