Làm thế nào để ghi đè một liên kết tượng trưng của một thư mục?


13

Có hai thư mục foo1foo2.

Đầu tiên tôi tạo một thư mục symlink bởi ln -s foo1 bar. Sau đó tôi muốn thay đổi symlink, vì vậy tôi đã gõ ln -sf foo2 bar

Nhưng bar vẫn được liên kết với foo1. Liên kết tượng trưng foo2 được tạo ra bên trong foo1.

Tôi nên gõ gì khi tôi muốn thay thế foo1 bởi foo2?

Tôi đã thử nghiệm trong ba môi trường.

  1. Ubuntu 12.04, ln (GNU coreutils) 8.13
  2. CentOS 6.4, ln (lõi GNU) 8.4
  3. OS X 10.7.5, ln (không có phiên bản)

Câu trả lời:


15

Cách thích hợp để làm điều này là sử dụng --no-dereference tùy chọn như vậy.

$ ln -snf foo2 bar

Điều này gây ra ln để coi các liên kết tượng trưng hiện có như một tập tin. Nếu không, nó là hội nghị bar đến foo1, đi xuống foo1 và sử dụng bản gốc TARGET tên như LINK_NAME và đó là lý do tại sao bạn kết thúc với một liên kết tượng trưng đến foo2 được tạo ra bên trong foo1 danh mục. Trang web trên ln tuyên bố như sau ...

-n, --no-dereference
       treat  LINK_NAME  as a normal file if it is a symbolic link to a
       directory

Dưới đây là kết quả đầu ra trên màn hình Arch Linux của tôi với phiên bản 8.21 của ln có và không có --no-dereference tùy chọn, tôi đã nhận được kết quả giống như bạn đã làm mà không có --no-dereference tùy chọn, nhưng sử dụng tùy chọn --no-dereference tùy chọn nó hoạt động như mong đợi.

$ mkdir foo1 foo2
$ ln -s foo1 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ln -sf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 bar -> foo1
$ ls -l foo1
  total 0
  lrwxrwxrwx 1 drew users 4 Sep 17 12:51 foo2 -> foo2
$ ln -snf foo2 bar
$ ls -l bar
  lrwxrwxrwx 1 drew users 4 Sep 17 12:52 bar -> foo2

Cảm ơn câu trả lời của bạn. Nếu đó là vấn đề phụ thuộc vào môi trường, tôi sẽ viết môi trường của mình. Bạn đang sử dụng hệ điều hành nào? đầu ra gì ln --version?
ironsand

Tôi đã thử điều này trên máy ảo Fedora 18 với phiên bản 8.17. Thật thú vị, tôi đã thử điều này trên máy tính để bàn Arch Linux của tôi với phiên bản 8.21 và nhận được kết quả giống như bạn đã làm. Có vẻ như một nơi nào đó nằm giữa hai phiên bản đó, một cái gì đó đã thay đổi. Các giải pháp tôi đã đăng làm việc trong cả hai trường hợp mặc dù.
Drew Chapin

FYI, tôi tìm thấy câu trả lời này trên diễn đàn justlinux.com .
Drew Chapin

Cảm ơn druciferre! Tôi thậm chí không bao giờ nghĩ rằng ln lệnh nên thường xuyên nâng cấp.
ironsand

Tôi cũng đã thử nghiệm trong osx. ln hoạt động tương tự như Ubuntu và centos với thư mục ghi đè và ln -snf giải quyết vấn đề. Mặc du ln -h là tùy chọn thích sử dụng trong osx.
ironsand
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.