Điều gì xảy ra nếu mv bị gián đoạn?


72

Điều gì xảy ra nếu mvlệnh Linux bị gián đoạn? Nói rằng, tôi đang di chuyển toàn bộ thư mục đến một nơi khác và làm gián đoạn nó trong khi nó đang di chuyển. Thư mục nguồn sẽ vẫn còn nguyên?

Câu trả lời:


51

Nếu bạn di chuyển một thư mục trên cùng một hệ thống tệp, bạn chỉ di chuyển mục nhập thư mục từ một vị trí trong hệ thống tệp sang một vị trí khác. Ví dụ, mv /source/dir /target/dirsẽ xóa mục nhập thư mục dirtừ /sourcevà tạo một mục mới trong /target. Điều đó được thực hiện bởi một cuộc gọi hệ thống nguyên tử (nghĩa là không bị gián đoạn). Các nút chứa các mục nhập thư mục dircũng như nội dung thực tế của chính thư mục không bị ảnh hưởng.

Nếu bạn di chuyển thư mục từ hệ thống tệp này sang hệ thống tệp khác, tất cả các tệp trước tiên được sao chép sang hệ thống tệp mới và sau đó hủy liên kết khỏi hệ thống tệp gốc. Vì vậy, nếu bạn làm gián đoạn mvtrong khi sao chép, bạn có thể kết thúc bằng hai bản sao của một số tệp - tại vị trí cũ và tại vị trí mới.


6
@Wesley: Không, sẽ không có một phần tập tin. Nếu hệ thống vẫn hoạt động (ví dụ: bạn nhấn ctrl-C), hệ thống sẽ tự động bị xóa. Nếu không (ví dụ như mất điện), tệp một phần có thể bị bỏ lại ở đâu đó không thể truy cập được trên đĩa đích, nhưng sẽ được dọn sạch bởi phần tiếp theo fsck(rất có thể sẽ tự động chạy khi khởi động lại, vì đĩa không được xử lý sạch).
Dave Sherohman

50
Sai lầm. Nếu bạn di chuyển dir từ một fs sang mv / fs1 / dir / fs2 / khác và bạn bị gián đoạn, / fs1 / dir / sẽ ở lại đây hoàn toàn. / fs1 / dir chỉ bị xóa khi di chuyển hoàn tất.

8
người dùng263131 là đúng. Chạy strace mv /fs1/dir /fs2/- điều cuối cùng mv làm là gọi unlinkattất cả các tệp nguồn cùng một lúc (không phải từng cái một khi chúng được sao chép).
Jakob

7
@JJ Có vẻ như đó là vì bạn đã sử dụng một bản mở rộng bash, trong trường hợp đó, mv coi mỗi tệp trong bản mở rộng là một nguồn riêng biệt (do đó thực hiện chúng riêng lẻ).
gkanwar

5
Vậy .... @bmk hoặc người khác, bạn có muốn cập nhật câu trả lời này để bớt ... sai không?
Artem Russakovskii

35

Việc triển khai GNU lặp lại các đối số trên dòng lệnh, cố gắng đổi tên trước và nếu thất bại, sao chép đệ quy và sau đó xóa đệ quy nguồn. Vì thế

mv a b c/

sẽ xóa a trước khi sao chép b và sẽ không bắt đầu xóa bất cứ thứ gì trong một trước khi bản sao đích hoàn thành.

Lưu ý rằng điều này chỉ áp dụng cho việc triển khai GNU.

Để làm rõ: nếu a là một thư mục chứa deb là một tệp, thứ tự sẽ là

  • tạo c / a
  • sao chép a / d -> c / a / d
  • sao chép a / e -> c / a / e
  • xóa a / d
  • xóa a / e
  • xóa một
  • sao chép b -> c / b
  • xóa b

1
Bạn có thể cung cấp một nguồn cho việc này? Những người trả lời khác đang nói rằng một tệp nguồn bị xóa ngay lập tức sau khi nó được sao chép sang một fs khác (tức là không phải tất cả được sao chép thì tất cả đã bị xóa).
jamesbtate

1
Kinh nghiệm. Tôi đã thêm một ví dụ để làm rõ hơn câu trả lời của tôi và những câu hỏi khác như thế nào. Nếu bạn chỉ liệt kê các tệp riêng lẻ thì thực sự mỗi tệp sẽ bị xóa ngay lập tức.
Simon Richter

Tôi quan sát hành vi được mô tả trong câu trả lời này trên macOS, nghĩa là với BSD mv, vì vậy nó không chỉ là GNU.
kirelagin

12

Bạn di chuyển một thư mục, làm gián đoạn di chuyển và thư mục gốc sẽ giữ nguyên:

$ mv a b/

Nếu bạn di chuyển nhiều thư mục, mỗi thư mục sẽ còn nguyên vẹn trên nguồn hoặc đích, tùy thuộc vào thời điểm bạn bị gián đoạn:

$ mv a b c/

Làm thế nào tôi có câu trả lời của mình:

$ mv --version
mv (GNU coreutils) 8.21

$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals.  If the copy fails, then the part
that was copied to the destination partition is removed.  If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.

Để kiểm tra, tôi đã sao chép một thư mục lớn vào thư mục NFS, bị gián đoạn và số lượng tệp trong thư mục lớn nguồn của tôi vẫn giữ nguyên và một phần nội dung được để lại trên thư mục NFS. Tôi đã sử dụng "find. -Ttype f | wc -l" để xác minh.

Có vẻ như câu trả lời của Simon là chính xác.


9

Câu trả lời được chấp nhận chắc chắn là sai về việc di chuyển giữa các hệ thống tệp - một thực tế đã giúp tôi tiết kiệm rất nhiều rắc rối một vài lần. Khi di chuyển một thư mục chứa thư mục con, không có tệp nào trong thư mục con sẽ bị xóa trước khi toàn bộ thư mục con được sao chép. Đây là, btw. Ý nghĩa thực sự của "đối tượng theo đối tượng" - thư mục con là một đối tượng (tệp) và do đó tính toàn vẹn của nó phải được giữ bởi một bản sao hoàn chỉnh tại đích trước khi có thể xóa mọi thứ. Vì vậy, câu trả lời của Simon xuất hiện với tôi là câu trả lời đúng.


4

Số mv vận hành đối tượng theo đối tượng, vì vậy các đối tượng đã được xử lý sẽ bị xóa khỏi nguồn.


2

Tất nhiên là không. Việc di chuyển được thực hiện theo đối tượng. Do đó, đối tượng di chuyển đến đích đến điểm ngắt sẽ không còn tồn tại trong nguồn nữa.

Nếu mv được cấp cho một tệp lớn (giữa khác nhau) và nó đã bị gián đoạn thì nguồn sẽ còn nguyên. Trên mục tiêu, bạn sẽ thấy một tệp không đầy đủ cho đến điểm bị gián đoạn.

Tuy nhiên, bạn có thể khôi phục mv bằng cùng một lệnh và quá trình sẽ tiếp tục.


2

Nếu bạn muốn ngắt mv vì bạn muốn ngắt kết nối khỏi thiết bị đầu cuối, bạn chỉ có thể gửi nó đến nền:

* press Ctrl+Z

# bg
# disown

1
Đó là một điểm tốt nhưng nó không trả lời câu hỏi thực tế.
Julie Pelletier

1
@JuliePelletier, nhưng đó là những gì tôi đang tìm kiếm để ai đó có thể quan tâm đến việc này.
Toàn bộ
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.