Có phải tốt hơn là luôn luôn sao chép và xóa, thay vì di chuyển?


18

Nói chung, tôi thấy mình hoảng loạn khi nhận ra rằng nếu tôi hủy di chuyển tệp, nó có thể khiến mục tiêu hoặc nguồn không đầy đủ. Câu hỏi này áp dụng cho các nền tảng dựa trên Windows và Unix. Tôi không bao giờ có thể nhớ chính xác làm thế nào lệnh di chuyển hoạt động trong cả hai trường hợp. Ví dụ: nếu bạn đang di chuyển một thư mục; Nó sao chép toàn bộ thư mục, và sau đó xóa nó sau, hoặc nó sao chép và sau đó xóa từng tệp riêng lẻ?

Tôi luôn nhận ra, sau khi gõ một cái gì đó giống như mv verybigdir dest, có lẽ tôi nên gõ cp -R verybigdir dest  &&  rm -R verybigdir(nơi &&toán tử tiến hành lệnh tiếp theo chỉ khi lệnh đầu tiên thành công) - hay điều này là vô nghĩa? Điều gì xảy ra, chính xác, khi tôi nhấn Ctrl+ Cnửa bước di chuyển? Tương tự như vậy, chính xác những gì xảy ra trên Windows khi tôi nhấn nút hủy?

Tôi không thể đếm số lần tôi đã di chuyển một cái gì đó (lần cuối cùng là khi sử dụng svn) và có hai thư mục, với nội dung được phân chia. Tôi đoán câu trả lời là khó, bởi vì không phải tất cả các ứng dụng di chuyển các nhóm tệp theo cùng một cách.


16
Dù bạn làm gì, đừng xóa đầu tiên.
nhạc chuông

@monotone Vui nhộn +1
Nick Bolton

Câu trả lời:


10

Trên Windows, di chuyển đến cùng ổ đĩa và phân vùng sẽ hoạt động giống như lệnh mv của Unix và đổi tên thư mục hoặc thay đổi cha mẹ của nó. Tuy nhiên, nếu bạn di chuyển nó sang trình điều khiển hoặc phân vùng khác, nó sẽ sao chép và xóa tệp theo tệp, do đó hiệu quả hơn là sử dụng tệp tar hoặc tệp zip không nén để di chuyển tệp nhanh hơn trên các phân vùng và ổ cứng . Nếu bạn đã hủy nó, nó sẽ chỉ dừng lại ở đó. Tôi tin điều tương tự cũng đúng với Unix nhưng tôi đã không thử nghiệm đủ với nó để chắc chắn 100%. Đây chỉ là vấn đề thay đổi inode, nhưng nếu nó nằm trên một phân vùng hoặc ổ đĩa khác, thì nó cần được sao chép vào các sector trên phân vùng hoặc ổ đĩa đó. Nếu bạn đã hủy nó trong quá trình chuyển, thì nó đã di chuyển một số tệp và tệp đang được chuyển sẽ thấy nó '

Cập nhật: Nếu bạn đã hủy bỏ một di chuyển và muốn tiếp tục di chuyển, chỉ cần phát hành lại lệnh để di chuyển. Nó có thể cảnh báo bạn rằng thư mục đích đã tồn tại, nhưng các tệp sẽ không bị ghi đè (trừ khi chúng tồn tại trước khi di chuyển ban đầu hoặc được thêm vào giữa hai lệnh di chuyển) ngay khi chúng được chuyển, chúng sẽ bị xóa khỏi nguồn (nếu trên một phân vùng hoặc ổ đĩa khác).


Ah, tôi đã không nghĩ về nén.
Nick Bolton

Bạn không thực sự cần phải nén, việc này có thể đòi hỏi nhiều thời gian. Đôi khi, mức nén 0 (lưu trữ) có thể thực hiện công việc di chuyển các thư mục lớn trên các ổ đĩa nhanh hơn nhiều.
Sói

"Trên Windows, di chuyển đến cùng ổ đĩa và phân vùng sẽ hoạt động giống như lệnh mv của Unix và đổi tên thư mục hoặc thay đổi cha mẹ của nó." - Khi sử dụng Windows Explorer, điều đó không đúng. Nó làm rất nhiều chuyện tào lao, mất nhiều thời gian và cuối cùng bạn có thể chia nội dung trên hai thư mục, hãy xem câu trả lời này cho một câu hỏi của tôi .
maaartinus

@maaartinus Trên thực tế, cách Windows Explorer hoạt động là nó đào sâu đệ quy trong các thư mục thay vì thay đổi nút cha. Bạn đã đúng mặc dù đối với Windows Explorer, nó không chỉ là một động thái nguyên tử. Tôi giả sử dòng lệnh đang được sử dụng, tôi nên đã hỏi.
Sói

11

Ngay cả trên một máy tính hoàn toàn ổn định không bao giờ bị lỗi: nếu bạn quan tâm đến dấu thời gian, thì mvtốt hơn là đơn giản cp.

( cp -asẽ lưu giữ dấu thời gian cho bạn và tôi cho rằng một cái gì đó tương tự tồn tại trên Windows).


1
Aha, dấu thời gian. Tôi đã không cân nhắc điều đó! +1
Nick Bolton

Các dấu thời gian thậm chí còn quan trọng một cách trung thực ...
Marcin

1
@Marcin, họ ở đó vì một lý do, nếu đó là những gì bạn đang hỏi ...
macek

10

Không.

Giải trình:

mv verybigdir dest

đổi tên Verybigdir thành mệnh. Đây là một hoạt động nguyên tử, tức là không thể thất bại nửa chừng.

Nếu Dest nằm trên thiết bị khác, mv sẽ sao chép trước, sau đó xóa phiên bản cũ. Đây không phải là một hoạt động nguyên tử. Nếu thất bại, bạn có thể chỉ có một bản sao của Verybigdir trong mệnh, nhưng Verybigdir vẫn sẽ hoàn tất.

Có, các ứng dụng khác có thể di chuyển các tập tin khác nhau.


2
Trên thực tế, tôi nghĩ rằng mv trên Linux sao chép / xóa từng tệp hoặc thư mục riêng lẻ, thay vì sao chép toàn bộ cây đến đích sau đó xóa toàn bộ cây khỏi nguồn ... vì vậy, nếu bạn hủy bỏ nửa chừng, bạn sẽ kết thúc với một số các tập tin ở cả hai nơi và không thư mục nào sẽ được hoàn thành.
cướp

3
@rob: Không. Thư mục là các tệp giống như các tệp khác và được xử lý theo cùng một cách. Hành vi bạn đang nói đến là đạt được mv verybigdir/* dest.
dmckee

2
Về cơ bản, mv xử lý từng đối số theo cách "cp && rm" ... mv verybigdir/* destchia mv của Verybigdir thành nhiều hoạt động di chuyển riêng biệt. Luôn nhớ rằng không giống như trên Windows, một chương trình / công cụ Linux không thể thấy rằng "*" ở đó, nó được mở rộng bởi trình bao.
Jürgen A. Erhard

4

Trên windows tôi luôn sao chép và xóa thay vì di chuyển. Tôi đã từng di chuyển các tập tin và đây là lần đầu tiên tôi nhận thấy một bộ nhớ xấu. Khi di chuyển tập tin, nó dừng lại ở giữa và tôi gặp lỗi vì vậy tôi đã kiểm tra thư mục nguồn và tập tin đã biến mất sau đó tôi kiểm tra đích và có một tập tin bị hỏng. Điều này xảy ra thường xuyên hơn với các tệp kích thước lớn hơn và hầu hết trong số chúng là các bản tải xuống mất hàng giờ để id khuyên bạn nên sao chép và sau đó xóa. Hãy tiết kiệm thời gian cho bản thân khi bắt đầu nó sẽ trả hết.


3

Trên unix, trên các di chuyển không vượt qua ranh giới hệ thống tập tin, mvkhông sao chép dữ liệu: nó chỉ cập nhật cơ sở dữ liệu inode trong các thư mục khác nhau. Đây là nhiều nhanh hơn cptrên các tập tin lớn.

Hơn nữa, sử dụng mvtrên các ranh giới hệ thống tập tin chỉ âm thầm gọi một cơ chế sao chép và xóa.

Vì vậy, tôi nghĩ rằng bạn nên thích mv.


Tổng kết một cách độc đáo.
Nick Bolton

"một cơ chế sao chép và xóa" có thể được hiểu là "sao chép từng tệp, sau đó xóa nó" hoặc "sao chép tất cả các tệp, sau đó xóa tất cả chúng".
j_random_hacker

2

Trong Windows, ít nhất, di chuyển chỉ đơn giản là Sao chép & Xóa tự động hơn. Tôi tin rằng mv di chuyển từng tệp riêng lẻ, có nghĩa là ^ c-ing sẽ không mất bất kỳ tệp nào, bạn sẽ chỉ kết thúc với các tệp của mình được phân chia giữa hai nơi - không giống như Windows Explorer, sẽ hủy di chuyển mọi thứ khi hủy.

Giải pháp của tôi cho vấn đề này là: Không bao giờ di chuyển trừ khi tôi chắc chắn tôi muốn di chuyển nó.


1

Nếu bạn đang sử dụng ACL trên hệ thống tệp nguồn, nhưng không phải trên đích, mv trên Linux sẽ sao chép nguồn và sau đó - vì không thể đặt ACL ở đích - dừng. Vì vậy, cuối cùng bạn có tập tin ở cả hai bên. Không có công tắc nào trong mv để ngăn chặn hành vi đó, vì vậy trong trường hợp này, cp && rm là thích hợp hơn.

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.