Câu trả lời:
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)
:
unlink(1)
:
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)
và unlink(2)
. Ngữ nghĩa vẫn sẽ khác nhau giữa các nền tảng.
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.
Ở 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.
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ự.