Có bất kỳ nguy hiểm trong việc sử dụng mv (thay vì cp theo sau là rm) không?


7

Tôi là một sinh viên tốt nghiệp có quyền truy cập vào một nhóm nghiên cứu Linux tại trường đại học của tôi. Trong những năm qua, tôi đã tích lũy được nhiều thư mục - tôi đoán "thư mục" là thuật ngữ Windows / Mac? - trong thư mục nhà của tôi ( ~). Khi tôi đang làm việc trên một mô phỏng mới, tôi tạo một thư mục mới trong thư mục chính của mình bằng cách sử dụng mkdirvà sau đó chạy mô phỏng trong thư mục đó.

Nhưng theo thời gian, tôi đã tích lũy được nhiều thư mục như vậy trong thư mục nhà của tôi. Bây giờ tôi muốn chuyển một số thư mục vào thư mục con. Ví dụ, tôi có thể muốn tạo một thư mục mới có tên gọi simulations1_10và sau đó di chuyển các thư mục simulation1, simulation2, ..., simulation10vào thư mục đó - vì vậy mà thư mục gốc của thư mục chính của tôi được tổ chức nhiều hơn nữa.

Để làm điều này, tôi có thể sử dụng cp. Ví dụ:

cp -r simulation1/ simulations1_10/

sẽ sao chép thư mục simulation1(và tất cả nội dung của nó) vào thư mục simulations1_10. Sau đó tôi có thể loại bỏ simulation1.

Nhưng, chuyển tôi không vượt qua ranh giới hệ thống tập tin, vì vậy mvnhiều nhanh hơn cp. ( mvtất nhiên cũng cho phép tôi tránh bước loại bỏ.) Ví dụ:

mv simulation1/ simulations1_10/

thực hiện thủ thuật một cách nhanh chóng (và không giống như cp, mvđược đệ quy theo mặc định). Theo câu trả lời cho câu hỏi này , mvnhanh hơn nhiều vì nó "chỉ cập nhật cơ sở dữ liệu inode trong các thư mục khác nhau."

Câu hỏi của tôi là, có bất kỳ nguy hiểm trong việc sử dụng mv?

Tôi nghĩ rằng một điều nguy hiểm là nếu mvbị gián đoạn (do mất điện, người dùng nhấn Ctrl+ C, v.v.) trong khi chuyển, tệp có thể bị hỏng ở cả nguồn đích. Điều này có đúng không?

Ngoài ra, nếu tôi sử dụng mv nhiều , có khả năng "cơ sở dữ liệu inode" sẽ được cập nhật quá thường xuyên, gây ra sự phân mảnh đĩa hoặc các vấn đề về ổ cứng / hệ thống tập tin khác không?


1
mv không thực sự đệ quy. Nó chỉ đơn thuần là di chuyển một thứ, inode của thư mục bạn chỉ định. Tất cả mọi thứ trong thư mục đó vẫn còn nguyên. Hãy nghĩ về nó như cắt một nhánh cây và gắn nó vào một vị trí khác trên cây: bạn chỉ thực hiện một vết cắt, thay vì làm một cái gì đó cho mỗi cành và lá.
jamesqf

@jamesqf Cảm ơn bạn! Tôi là một người dùng tương đối mới của Unix và Linux; là inode của loại thư mục giống như một con trỏ đến dữ liệu?
Andrew

Câu trả lời:


9

Các renamechức năng (làm nền tảng cho các lệnh mv, "Tiện ích mv thực hiện hành động tương đương với đổi tên () chức năng" ) là nguyên tử (xem POSIX http://pubs.opengroup.org/onlinepubs/009695399/functions/rename.html , mà đề cập đến tiêu chuẩn C):

Hàm đổi tên () này tương đương với các tệp thông thường được xác định theo 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 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ử.

(Nhưng hãy xem phần này để biết thêm: https://unix.stackexchange.com/a/322074/88983 .)

Các hoạt động bị gián đoạn, có thể là do Ctrl-C hoặc nếu không, sẽ không bao giờ dẫn đến các tệp được chuyển một phần. Thật vậy, như bạn đã đề cập, một hệ thống tập tin duy nhất mvkhông thực sự sao chép bất kỳ nội dung tệp nào, chỉ siêu dữ liệu tệp. Điều tồi tệ nhất sẽ xảy ra ở mặt trước đó là xem các thư mục được di chuyển một phần (nếu bạn làm như vậy mv a b c dest, có thể bị gián đoạn và chỉ có ví dụ được achuyển vào dest, nhưng tất cả các tệp và nội dung của chúng sẽ được di chuyển đúng cách), không được di chuyển một phần thường xuyên các tập tin.

Về câu hỏi bên inode của bạn, tôi sẽ nói rằng nó thường không phải là một mối quan tâm; cập nhật các nút để di chuyển chỉ một vài thư mục xung quanh là một hoạt động thường xuyên, chi phí thấp (ghi nội dung tệp xảy ra trên cùng một hệ thống tệp sẽ là một nguyên nhân tiềm năng lớn hơn nhiều hoặc bị phân mảnh, tùy thuộc vào loại hệ thống tệp cụ thể).


Cám ơn rất nhiều! Khi bạn nói, "nội dung tệp viết xảy ra trên hệ thống tập tin cùng phải là một tiềm năng lớn hơn nhiều hit hiệu suất hoặc phân mảnh nguyên nhân, tùy thuộc vào loại hệ thống tập tin cụ thể," không có nghĩa là cpcó thể thực sự gây ra nhiều phân mảnh, vv hơn mv?
Andrew

1
Tôi đã nghĩ đến những người dùng khác trong cùng cụm đang viết đồng thời với các hoạt động dọn dẹp của bạn, nhưng cũng đúng là việc sao chép các tệp sẽ tốn nhiều công sức hơn so với việc di chuyển chúng và có nhiều khả năng gây ra sự phân mảnh (mặc dù phân mảnh nói chung không phải là mối quan tâm lớn đối với các hệ thống tập tin Unix điển hình).
dhag 30/03/2015

Lưu ý rằng POSIX chỉ đảm bảo tính nguyên tử khi mục tiêu đã tồn tại. Nó không tồn tại khi mục tiêu không tồn tại, mặc dù hầu hết các hệ thống unix đều cung cấp bảo đảm này cho các hệ thống tệp gốc của chúng.
Gilles 'SO- ngừng trở nên xấu xa'
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.