Câu trả lời:
Câu trả lời ngắn gọn là nó không.
thực hiện các hành động tương đương với
rename()
chức năng
rename()
không sao chép nội dung, nó chỉ đổi tên nó trên đĩa. Đó là một hoạt động nguyên tử hoàn toàn không bao giờ thất bại hoàn thành một phần.
Điều đó không nói lên toàn bộ câu chuyện, tuy nhiên. Trường hợp hiệu ứng này có thể xảy ra là khi cố gắng di chuyển tệp giữa các thiết bị: trong trường hợp đó, không thể thực hiện đổi tên trong hệ thống tệp. Để có tác dụng di chuyển, mv
đầu tiên sao chép nguồn vào đích và sau đó xóa nguồn. Trong thực tế, mv /mnt/a/X /mnt/b/Y
về cơ bản là tương đương với cp /mnt/a/X /mnt/b/Y && rm /mnt/a/X
. Đó là cách duy nhất để di chuyển tập tin giữa các thiết bị có thể hoạt động.
Khi mv
không có quyền xóa tệp nguồn đó, một lỗi sẽ được báo cáo, nhưng tại thời điểm đó, bản sao đã xảy ra. Không thể tránh điều đó bằng cách kiểm tra các quyền trước vì các điều kiện chủng tộc có thể xảy ra khi các quyền thay đổi trong quá trình vận hành.
Thực sự không có cách nào để ngăn chặn tình huống có thể xảy ra này, ngoài việc không thể di chuyển các tệp giữa các thiết bị. Sự lựa chọn cho phép mv
giữa bất kỳ nguồn và đích nào làm cho mọi thứ đơn giản hơn trong trường hợp chung, với chi phí cho hành vi kỳ quặc (nhưng không phá hủy) trong những trường hợp bất thường này.
Đây cũng là lý do tại sao việc di chuyển một tệp lớn trong một thiết bị nhanh hơn nhiều so với việc di chuyển nó sang thiết bị khác.