cách cập nhật mục tiêu liên kết tượng trưng (ln -f -s không hoạt động)


45

Tôi đang sử dụng

ln -f -s / var / www / html / phát hành / build1390 ứng dụng hiện tại

để cập nhật liên kết tượng trưng "ứng dụng hiện tại" với một điểm đến mới. Tuy nhiên, điều này không hoạt động, liên kết "hiện tại ứng dụng" giữ cho đích đến ban đầu, tuy nhiên, tôi không gặp phải bất kỳ lỗi nào ...

Tôi không muốn xóa liên kết và tạo lại nó, chỉ cập nhật mục tiêu của một liên kết hiện có. Điều đó có thể không?

Câu trả lời:


55

Điều đó làm việc cho tôi, đầu ra là strace ln -f -s /var/www/html/releases/build1390 app-currentgì?

Ồ, vì nó là một thư mục bạn cần thêm -nmà không có sự thiếu sót nào và điều này sẽ giải quyết vấn đề. -fthực sự tiện lợi hơn vì việc thêm -f chỉ khiến nó không liên kết được. Mặc dù tôi đoán nó có thể sẽ xảy ra nhanh hơn vài trăm ms trên một hệ thống được tải bình thường.

Ví dụ: nếu arf đã trỏ đến / home:

bước đi với -n:

strace ln -n -f -s / arf
...
symlink("/", "arf")           = -1 EEXIST (File exists)
unlink("arf")                           = 0
symlink("/", "arf")           = 0

không có -n:

strace ln -f -s / arf
...
write(2, "ln: "..., 4ln: )                  = 4
write(2, "`arf/': cannot overwrite director"..., 34`arf/': cannot overwrite directory) = 34
write(2, "\n"..., 1)                    = 1

Vì vậy, không có -narf bị hủy đăng ký nên tôi coi nó như arf như thể nó thực sự /. Trong ví dụ cụ thể của bạn, nếu không có lỗi, tôi nghĩ có lẽ bạn đã tạo một liên kết tượng trưng mới bên trong /var/www/html/releases/build1390 app-currentvà sẽ muốn dọn sạch nó.


4
thật tuyệt, đó là - nó đã làm điều đó Cảm ơn rất nhiều!
solsol

12

Bạn có thể sử dụng -nhoặc --no-dereferenceđể ngăn chặn mục tiêu bị hủy đăng ký nếu đó là một liên kết tượng trưng. Bạn cũng có thể sử dụng -Thoặc --no-target-directoryđể đảm bảo rằng tệp mục tiêu sẽ luôn được coi là một tệp thông thường.

Chúng tạo ra hành vi hơi khác nhau, như ví dụ sau đây cho thấy. Giả sử srclà một số tệp, dirlinklà một liên kết tượng trưng đến một thư mục và dirlà một thư mục thực tế.

Sử dụng -n:

  • ln -sfn src dirlinkghi đè dirlinkvà liên kết nó vớisrc
  • ln -sfn src dir tạo liên kết dir/src -> src

Sử dụng -T:

  • ln -sfT src dirlinkghi đè dirlinkvà liên kết nó vớisrc
  • ln -sfT src dir tạo thông báo lỗi: ln: ‘dir’: cannot overwrite directory

1
có câu trả lời đúng và súc tích nhất cho người dùng Linux.
ross

Có cách nào để buộc ghi đè thư mục đích để bạn không nhận được thông báo lỗi cannot overwrite directorykhông?
gitaarik

@rednaw Bạn có thể làm điều này bằng cách xâu chuỗi một vài lệnh, nhưng lnbản thân nó không xóa các thư mục - đây có thể là một ý tưởng tồi, bởi vì nó sẽ yêu cầu loại bỏ đệ quy một số lượng lớn các tệp.
augurar
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.