Tại sao mv lại nhanh hơn cp rất nhiều? Làm thế nào để tôi phục hồi từ một lệnh mv không chính xác?


17

Tôi kéo và thả một thư mục vào một thư mục khác do FileZilla nhầm lẫn.

~/big_folder
~/some_other_folder

Các thư mục đã được di chuyển là một rất lớn. Nó bao gồm hàng trăm ngàn tệp (node_modules, tệp hình ảnh nhỏ, rất nhiều thư mục)

Điều kỳ lạ là sau khi tôi thả chuột ra, việc di chuyển đã xong. Thư mục "big_folder" được chuyển vào "some_other_folder".

~/some_other_folder/big_folder

(không có big_foldertrong ~/sau khi di chuyển)

Sau đó, tôi nhận ra lỗi và thử di chuyển trở lại nhưng nó thất bại cả trên FileZilla và thiết bị đầu cuối.

Sau đó, tôi phải cp -rsao chép lại các tệp vì có mã phía máy chủ truy cập vào các tệp đó trong~/big_folder

Và phải mất mãi mãi để chờ đợi ...

Tôi nên làm gì?

BTW, đây là đầu ra từ FileZilla (đó là thất bại của việc di chuyển trở lại):

Status:       Renaming '/root/big_folder' to '/root/some_other_folder/big_folder'
Status:       /root/big_folder -> /root/some_other_folder/big_folder

Status:       Renaming '/root/some_other_folder/big_folder' to '/root/big_folder'
Command:  mv "big_folder" "/root/big_folder"
Error:          mv /root/some_other_folder/big_folder /root/big_folder: received failure with description 'Failure'

37
Ah, thông báo lỗi hữu ích nhất received failure with description 'Failure'.
Thuyền trưởng Man

3
Đi đến một thiết bị đầu cuối, và gõ lệnh mv /root/some_other_folder/big_folder /root/big_folder. thông báo lỗi gì bạn nhận được?
ctrl-alt-delor

Tôi có thể sẽ đi vớicp -al
Nemo

1
mv vs cpCâu hỏi của OP được giải quyết, nhưng tôi rất muốn nghe lý do tại sao anh ấy có thể di chuyển thư mục theo một hướng ngay lập tức mà không phải theo hướng khác.
dùng1717828

4
Vì lý do cơ bản giống như vậy, việc chuyển một cuốn sách từ phòng này sang phòng khác nhanh hơn nhiều so với việc tạo ra một bản sao của cuốn sách.
David Richerby

Câu trả lời:


63

Nếu một thư mục được di chuyển trong cùng một hệ thống tệp (cùng phân vùng), thì tất cả những gì cần thiết là đổi tên đường dẫn tệp của thư mục. Không có dữ liệu ngoài mục nhập thư mục cho chính thư mục phải được thay đổi.

Khi sao chép thư mục, dữ liệu cho mỗi và mọi tệp cần được sao chép. Điều này liên quan đến việc đọc tất cả các dữ liệu nguồn và viết nó tại đích.

Di chuyển một thư mục giữa các hệ thống tập tin sẽ liên quan đến việc sao chép dữ liệu đến đích và xóa nó khỏi nguồn. Điều này sẽ mất nhiều thời gian như sao chép (sao chép) dữ liệu trong một hệ thống tập tin duy nhất.


Nếu FileZilla đổi tên thành công thư mục từ ~/big_folderthành ~/some_other_folder/big_folder, thì tôi sẽ hoàn nguyên việc đó bằng cách sử dụng

mv ~/some_other_folder/big_folder ~/big_folder

... sau khi làm đầu tiên chắc chắn rằng không có mục gọi là ~/big_folder(nếu có, động thái này sẽ đặt big_foldertừ some_other_foldervào ~/big_folderthư mục như một thư mục con).


6
Ồ ... đó là lý do tại sao tôi thấy từ "đổi tên" thay vì "di chuyển" trong đầu ra?
AGamePlayer

2
@AGamePlayer Vâng, đúng rồi.
Kusalananda

4
@AGamePlayer "Thất bại" không may là một mô tả lỗi tốt. Tôi đã có thể sử dụng mv ~/some_other_folder/big_folder ~/sau khi chắc chắn rằng không có ai khác big_foldertrong thư mục nhà. Tôi chưa bao giờ sử dụng FileZilla.
Kusalananda

10
Một lý do khác để không phụ thuộc vào các công cụ GUI của Windows để thực hiện một số bảo trì tệp trên Unix.
Mark Stewart

4
@MarkStewart tại sao lại có trên Unix trên cuối bình luận của bạn?; Có một thời gian đó là một ý tưởng tốt?
ctrl-alt-delor

11

Câu trả lời hiện có là rất tốt, nhưng tôi muốn mở rộng thêm một chút bằng cách hiển thị chính xác những gì đang xảy ra khi bạn di chuyển so với khi bạn sao chép một tệp. Khi bạn nhìn vào các tòa nhà trong một bản sao, bạn sẽ thấy:

open("hello1.txt", O_RDONLY)               = 3
open("hello2.txt", O_WRONLY|O_CREAT, 0644) = 4
read(3, "Hello, world!\n", 4096)           = 14
write(4, "Hello, world!\n", 14)            = 14
close(3)                                   = 0
close(4)                                   = 0

Điều này sẽ mở tệp nguồn, sau đó tạo một tệp thứ hai. Sau đó nó đọc nội dung của tệp nguồn vào bộ nhớ và ghi bộ nhớ đó vào tệp đích. Điều này đòi hỏi một số chuyển đổi ngữ cảnh và một số I / O đĩa có thể khá cao đối với các tệp lớn. Nếu bạn di chuyển một tập tin, tuy nhiên, bạn thấy:

rename("hello1.txt", "hello2.txt")         = 0

Điều quan trọng cần nhớ là bạn sẽ chỉ thấy tệp được đổi tên nếu nó nằm trên cùng một phân vùng trên cùng một đĩa vật lý. Nếu bạn tạo một tệp khổng lồ, nhiều gigabyte và sau đó di chuyển nó giữa hai vị trí trong nhà, bạn sẽ thấy hành động hoàn tất ngay lập tức. Mặt khác, nếu bạn di chuyển nó sang một thiết bị bên ngoài, sẽ mất nhiều thời gian để di chuyển như thể bạn đã sử dụng cpthay thế. Điều này là do việc di chuyển một tệp chỉ có thể được thực hiện bằng cách đổi tên nó nếu nó nằm trên cùng một phân vùng.


OP đã chuyển một thư mục, không phải là một tập tin.
AL

Nó vẫn áp dụng tho, trừ khi OP đang di chuyển các thư mục trống, đó sẽ là trường hợp duy nhất không có tệp nào được tham gia
glace

@AL Trong các hệ thống giống như Unix, mọi thứ đều là một tệp.
Thess

@AL Một tệp văn bản chỉ là một ví dụ. Đối với một thư mục, sự khác biệt duy nhất là bạn sẽ có một số getdents()mkdir()các cuộc gọi được rắc xung quanh.
rừng
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.