Có sự khác biệt nào giữa mv và {cp + rm tệp cũ} trên Unix không?


13
  • mv a b

  • cp a b;rm a

Đây là hai bộ báo cáo. Có một số khác biệt giữa những gì họ làm?


1
nguyên tử? Tôi thực sự không biết nếu lệnh mv là nguyên tử.
Quảng trường Adriano Varoli

Đúng. Tại sao bạn hỏi

1
Bây giờ, mvtương tự như ln+ rm, tuy nhiên, cái trước sẽ hoạt động cho các di chuyển hệ thống tập tin chéo (sau đó trở thành cp+ rm), trong khi cái sau sẽ thất bại ln(không hỗ trợ các liên kết cứng của hệ thống tập tin chéo).
Chris Jester-Young

Mỗi ngày là một ngày học - đối với bất kỳ ai đến đây tự hỏi làm thế nào để ghi đè hành vi mặc định này, bạn cần --remove-destinationchuyển đổi - stackoverflow.com/a/9371263/409638
robert

Câu trả lời:


20

Giả sử các tệp liên quan nằm trên cùng một hệ thống tệp, thì mv chỉ cần thay đổi con trỏ trong hệ thống tệp, trong khi cp sao chép toàn bộ nội dung của tệp và rm một lần nữa thay đổi con trỏ. Vì vậy, mv là hiệu quả hơn nhiều.


Nhưng họ làm điều tương tự, phải không?
Lazer

8
Không, họ không.

2
@eSKay: Không. Hai kịch bản: 1. Mục tiêu không tồn tại. mvchỉ đổi tên tệp (inode giống như tệp gốc). cptạo một inode mới cho tập tin mới. 2. Mục tiêu không tồn tại. mvhủy liên kết (loại bỏ) tệp mục tiêu và đổi tên, trong một bước. cpghi đè lên nút của tệp đích.
Chris Jester-Young

7
Cũng mvkhông bao giờ thay đổi quyền hoặc quyền sở hữu. Hãy tưởng tượng bạn muốn chuyển một tập tin từ homedir của bạn sang homedir của riêng bạn. Nếu bạn mv, bạn sẽ kết thúc với một tập tin trong homedir thuộc về bạn thân của bạn. Bạn không thể chownhoặc chmodtùy thuộc vào các quyền thậm chí không sửa đổi hoặc đọc nó. Nếu bạn làm cptheo rmtập tin sẽ thuộc về bạn và mọi thứ đều ổn.
Ludwig Weinzierl

9

Có, mv có cơ hội là nguyên tử trên cùng một đĩa, trong khi sự kết hợp giữa cp và rm không bao giờ có.

Điều này giả định rằng mv được thực hiện bằng cách sử dụng rename(), đó là cuộc gọi có bảo đảm. Xem, ví dụ, bài đăng nhóm tin này , trong đó trích dẫn POSIX:

Hàm đổi tên () này tương đương với các tệp thông thường so với các tệp được xác định bởi tiêu chuẩn ISO C. Bao gồm của nó ở đây mở rộng định nghĩa đó để bao gồm các hành động trên các thư mục và chỉ định hành vi khi tham số mới đặt tên cho một tệp đã tồn tại. Đặc tả đó đòi hỏi hành động của hàm phải là nguyên tử.


7

Trên cùng một hệ thống tệp, mv thay đổi tham chiếu thư mục, trỏ đến cùng một nút (dữ liệu tệp và siêu dữ liệu), do đó:

  • là một hoạt động nguyên tử (nó không thể bị gián đoạn bởi một hoạt động tập tin quy trình khác)
  • chỉ mất một lượng không gian đĩa bổ sung nhỏ (tên bổ sung trong thư mục)
  • giữ quyền và quyền sở hữu tập tin
  • có thể nhanh hơn nhiều, tùy thuộc vào lượng dữ liệu

Sao chép và xóa

  • không phải là nguyên tử (một quá trình khác có thể can thiệp giữa các lệnh cp và rm)
  • yêu cầu lưu trữ dữ liệu tệp hai lần trên đĩa trong một khoảng thời gian ngắn (giữa các lệnh cp và rm)
  • thay đổi quyền và quyền sở hữu tệp thành mặc định
  • có thể chậm hơn hoặc thậm chí thất bại, tùy thuộc vào lượng dữ liệu

4

Khi nguồn và đích nằm trên cùng một khối lượng vật lý, thì cách tiếp cận đầu tiên chỉ đơn giản là đổi tên và rất nhanh (ngay cả khi (các) tệp rất lớn).

cp& rmsẽ luôn phải tải / lưu trữ tất cả dữ liệu, ngay cả khi không cần thiết.


3

mv thực chất là một hoạt động "đổi tên". Điều này có nghĩa là tập tin được để ở cùng một vị trí trên đĩa. Không có hoạt động tập tin thực tế được thực hiện.


2

Đúng.

mv chỉ đơn giản là thay đổi siêu dữ liệu của hệ thống tệp trên tệp liên quan đến tên và vị trí của nó, trong khi cp tạo một bản sao riêng biệt của tệp, mất nhiều thời gian hơn vì nó phải đọc đầy đủ tệp đầu tiên và sau đó ghi nội dung của nó vào tệp khác


2

cp và rm nặng hơn nhiều về việc sử dụng đĩa và có thể thất bại vì lý do không gian đĩa.


2

Sự khác biệt là mv bảo tồn các thuộc tính tệp trong khi cp theo mặc định thì không, ví dụ như đặt ngày tạo thành ngày hiện tại.

Để ghi đè mặc định này, hãy sử dụng "cp -p" để duy trì sửa đổi dữ liệu lần cuối, thời gian truy cập lần cuối, ID người dùng và ID nhóm (chỉ khi nó có quyền để thực hiện việc này), các bit cho phép tệp và SUID và SGID chút í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.