2010-07-28 46 views
5

Thông thường để thay đổi mục tiêu liên kết tượng trưng trước tiên sẽ hủy liên kết tệp và sau đó tạo lại liên kết tượng trưng với đường dẫn đích mới. Tuy nhiên nó sẽ được gán một số inode mới.làm thế nào để thay đổi mục tiêu liên kết tượng trưng trong khi vẫn giữ mã số

Có thể có một api Mac riêng với chức năng update_target_for_symlink(), vì vậy inode có thể giữ nguyên?

Trong trường hợp bạn tự hỏi tôi cần nó cho một trình quản lý tệp. Tôi nghi ngờ rằng điều này là có thể ở tất cả. Anyways thats những gì làm cho nó thú vị.

Trả lời

7

Dường như điều này hoàn toàn không thể thực hiện được.

+0

yeah, đó là chính xác những vấn đề :-) – neoneye

2

Liên kết là tên bổ sung được liên kết với inode. Vì vậy, không có khả năng để nhắm mục tiêu lại liên kết vì liên kết không phải là một đối tượng duy nhất nhắm mục tiêu tệp. Đây là tên phụ của tệp.

Đó là lý do tại sao bạn phải hủy liên kết đầu tiên (xóa tên được liên kết với tệp) và sau đó tạo liên kết mới (thêm tên bổ sung) vào tệp mới.

Inode của liên kết không thuộc liên kết, nó thuộc về tệp. Một tệp bao gồm danh sách các tên ("liên kết"), một mã định danh (inode) và một khối dữ liệu chứa nội dung tệp.

Có thể đổi tên liên kết tượng trưng, ​​vì nó chỉ đề cập đến tên văn bản của tệp.

Từ hướng dẫn sử dụng: Có chín cuộc gọi hệ thống không theo liên kết và hoạt động trên chính liên kết tượng trưng. Đó là: lchflags (2), lchmod (2), lchown (2), lstat (2), lutimes (2), readlink (2), đổi tên (2), rmdir (2) và bỏ liên kết (2).

+2

Phần đầu tiên là đúng đối với các liên kết cứng, nhưng ít nhiều không liên quan khi OP hỏi về liên kết tượng trưng. – BCS

2

Khi nhìn kỹ hơn, ln -sf dường như làm những gì bạn muốn.

Cột đầu tiên là số inode. Lưu ý nó không thay đổi:

$ ln -s foo bar 
$ ls -li bar 
    16503 lrwxrwxrwx 1 golemon golemon 3 2010-08-21 12:29 bar -> foo 
$ ln -sf buz bar 
$ ls -li bar 
    16503 lrwxrwxrwx 1 golemon golemon 3 2010-08-21 12:29 bar -> buz 

Dường như ln-sf sử dụng chỉ đơn giản là bỏ liên kết() và liên kết tượng trưng() để thực hiện điều này:

$ strace ln -sf quux bar 
    <snip> 
    symlink("quux", "bar")     = -1 EEXIST (File exists) 
    unlink("bar")       = 0 
    symlink("quux", "bar")     = 0 

$ ls -li bar 
    16503 lrwxrwxrwx 1 golemon golemon 4 2010-08-21 12:31 bar -> quux 
+1

Tôi cảm thấy như tôi đang thiếu một cái gì đó bởi vì @neoneye âm thanh như ông đã cố gắng này, và nó có vẻ hoàn toàn mâu thuẫn với những gì @ UnixShadow nói. – bukzor

+1

Tôi thấy bạn nhận được cùng một inode. Điều này thực sự thú vị. Tuy nhiên tôi nhận được inodes khác nhau khi tôi cố gắng như vậy. Tôi đoán bạn không có trên Mac. Bạn đang sử dụng nền tảng nào? – neoneye

+0

Nó có hoạt động nếu bạn thực hiện các hoạt động khác ở giữa không? – BCS