Câu trả lời:
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/dir
sẽ xóa mục nhập thư mục dir
từ /source
và 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 dir
cũ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 mv
trong 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.
strace mv /fs1/dir /fs2/
- điều cuối cùng mv làm là gọi unlinkat
tấ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).
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 d và e và b là một tệp, thứ tự sẽ là
mv
, vì vậy nó không chỉ là GNU.
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.
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.
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.
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.
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
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).