Sự khác biệt giữa unlink và rm là gì?


Câu trả lời:


68

Cả hai đều là một trình bao bọc cho cùng một chức năng cơ bản là một unlink()cuộc gọi hệ thống.

Để cân nhắc sự khác biệt giữa các tiện ích người dùng.

rm(1):

  • Lựa chọn khác.
  • Thêm thông tin phản hồi.
  • Kiểm tra vệ sinh.
  • Chậm hơn một chút cho các cuộc gọi đơn là kết quả của các cuộc gọi trên.
  • Có thể được gọi với nhiều đối số cùng một lúc.

unlink(1):

  • Kiểm tra độ tỉnh táo ít hơn.
  • Không thể xóa thư mục.
  • Không thể tái diễn.
  • Chỉ có thể lấy một đối số tại một thời điểm.
  • Nghiêng về phía bên ngoài cho các cuộc gọi duy nhất do tính đơn giản của nó.
  • Chậm hơn khi so sánh với việc đưa ra rm(1)nhiều đối số.

Bạn có thể chứng minh sự khác biệt với:

$ touch $(seq 1 100)
$ unlink $(seq 1 100)
unlink: extra operand `2'

$ touch $(seq 1 100)
$ time rm $(seq 1 100)

real    0m0.048s
user    0m0.004s
sys     0m0.008s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do rm $i; done

real    0m0.207s
user    0m0.044s
sys     0m0.112s

$ touch $(seq 1 100)
$ time for i in $(seq 1 100); do unlink $i; done

real    0m0.167s
user    0m0.048s
sys     0m0.120s

Tuy nhiên, nếu chúng ta đang nói về một cuộc gọi không giới hạn đến unlink(2)chức năng hệ thống , thì bây giờ tôi nhận ra có lẽ không phải là điều bạn đang tính toán.

Bạn có thể thực hiện một hệ thống unlink()trên các thư mục và các tập tin như nhau. Nhưng nếu thư mục là cha mẹ của các thư mục và tệp khác, thì liên kết đến phụ huynh đó sẽ bị xóa, nhưng con cái sẽ bị treo lủng lẳng. Đó là ít hơn lý tưởng.

Biên tập:

Xin lỗi, làm rõ sự khác biệt giữa unlink(1)unlink(2). Ngữ nghĩa vẫn sẽ khác nhau giữa các nền tảng.


Điều đó có nghĩa là trong các hệ thống tập tin unix loại bỏ một thư mục và đệ quy tất cả các tệp trong đó sẽ luôn luôn là một hoạt động tỷ lệ thuận với số lượng tập tin / thư mục chứa nó? Khi xảy ra khi tôi hủy liên kết một thư mục là cha mẹ với các tập tin / thư mục khác? Nó không bao giờ bị xóa sổ và tôi mất không gian này mãi mãi?
Marcin

6
Về mặt kỹ thuật có thể để các thư mục / tệp mồ côi trên hầu hết nếu không phải tất cả các hệ thống tệp. Sửa lỗi này thường có nghĩa là chạy một công cụ sửa chữa hệ thống tập tin. Trên Unix / Linux, các công cụ này được gọi là 'fsck' và một số biến thể cụ thể cho các hệ thống tệp khác nhau. Nếu họ khôi phục được thứ gì đó, thông thường họ sẽ để nó trong một thư mục có tên 'mất + tìm thấy'
ConcernedOfTunbridgeWells

1
Chính xác. rm sẽ tái diễn từ dưới cùng của cây lên. Bạn có thể chứng minh làm thế nào với : mkdir -p 1/2/3; touch 1/one 1/2/two 1/2/3/three; rm -ri 1. Nếu bạn hủy liên kết thư mục cha thì sẽ mất không gian dành cho trẻ em cho đến khi fsck tìm thấy sự khác biệt.
Dan Carley

1
Bạn đang nói về cái gì vậy? $ mkdir -p 1/2/3 $ hủy liên kết 1 hủy liên kết: không thể hủy liên kết `1 ': Có phải thư mục Người dùng gây rò rỉ" bộ nhớ "cần fsck không? Không có khả năng!
Thomas

1
Cả hai trang web Linux và FreeBSD đều tuyên bố rõ ràng rằng nó sẽ thất bại khi cố gắng chạy unlink () trên một thư mục.
Thomas

8

Ở cấp độ thông số POSIX, những gì rm làm được chỉ định chặt chẽ hơn nhiều so với những gì hủy liên kết .

Tính di động của kết quả có vẻ tốt hơn khi sử dụng rm, nếu tập lệnh của bạn phải chạy trên hệ điều hành.


4

Phần chậm của việc xóa là mã hệ thống tệp và nội dung đĩa, không phải là chuẩn bị không gian người dùng của lệnh gọi hệ thống unlink ().

Tức là: nếu chênh lệch tốc độ có vấn đề, thì bạn không nên lưu trữ dữ liệu trên hệ thống tệp.

hủy liên kết chỉ là một "ánh sáng" rm. rm có nhiều tính năng hơn nhưng chúng làm điều tương tự.

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.