Tôi vừa mới cài đặt thư mục 49GB vào đường dẫn tệp xấu, có thể khôi phục trạng thái ban đầu của các tệp không?


58

Tôi có (tốt, tôi đã có ) một thư mục:

/media/admin/my_data

Nó có kích thước xấp xỉ 49GB và có hàng chục ngàn tệp trong đó. Thư mục là điểm gắn kết của phân vùng LUKS đang hoạt động.

Tôi muốn đổi tên thư mục thành:

/media/admin/my_data_on_60GB_partition

Lúc đó tôi không nhận ra, nhưng tôi đã ra lệnh từ thư mục nhà nên cuối cùng tôi đã làm:

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

Vì vậy, sau đó mvchương trình bắt đầu di chuyển /media/admin/my_datavà nội dung của nó vào một thư mục mới ~/my_data_on_60GB_partition.

Tôi đã sử dụng Ctrl+ Cđể hủy lệnh một phần thông qua, vì vậy bây giờ tôi có cả đống tệp được chia trên các thư mục:

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

/media/admin/my_data           <---- about 47GB of orig files in here    

Thư mục mới ~/my_data_on_60GB_partitionvà một số thư mục con của nó được sở hữu bởi root.
Tôi giả sử mvchương trình phải sao chép các tập tin dưới dạng root ban đầu và sau đó sau khi chuyển chownchúng trở lại tài khoản người dùng của tôi.

Tôi có một bản sao lưu cũ của thư mục / phân vùng.
Câu hỏi của tôi là, có thể khôi phục đáng tin cậy các tập tin đã được di chuyển?

Đó là, tôi chỉ có thể chạy:

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

hoặc tôi nên từ bỏ việc cố gắng phục hồi, vì các tập tin có thể bị hỏng và hoàn thành một phần, v.v.?

  • HĐH - Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25

36
Tập thói quen khi hoảng loạn gõ Control-Z(tạm dừng) chứ không phải Control-C. Trong trường hợp này, sau đó bạn sẽ có thể xem tệp nào đang được chuyển vào thời điểm đó và vì vậy biết tệp nào chỉ được sao chép một phần. Sau đó, bạn có thể quyết định bình tĩnh về cách tiến hành. (Sử dụng kill -stopcho các quy trình không trong tty).
meuh

1
2GB + 47GB = 60GB ???
tbodt

7
@tbodt (2GB + 47GB) < 60GB. dung lượng phân vùng là 60GB, kích thước của thư mục và nội dung của nó: 49GB.
the_velour_fog

Câu trả lời:


87

Khi di chuyển tệp giữa các hệ thống tệp, mvkhông xóa tệp trước khi sao chép xong và nó xử lý tệp liên tục (ban đầu tôi nói rằng nó sao chép lần lượt xóa từng tệp, nhưng điều đó không được đảm bảo - ít nhất là mvsao chép GNU sau đó xóa từng lệnh- lần lượt đối số dòngPOSIX chỉ định hành vi này ). Vì vậy, bạn nên có tối đa một tệp không đầy đủ trong thư mục đích và bản gốc vẫn sẽ nằm trong thư mục nguồn.

Để di chuyển mọi thứ trở lại, hãy thêm -icờ để mvkhông ghi đè lên bất cứ điều gì:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(giả sử bạn không có bất kỳ tệp ẩn nào để khôi phục ~/my_data_on_60GB_partition/) hoặc tốt hơn (do bạn đã phát hiện ra, bạn có thể có nhiều tệp đang chờ xóa), hãy thêm -ncờ để mvkhông ghi đè lên bất cứ điều gì nhưng không hỏi bạn về nó:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

Bạn cũng có thể thêm -vcờ để xem những gì đang được thực hiện.

Với bất kỳ tuân thủ POSIX nào mv, cấu trúc thư mục gốc vẫn còn nguyên vẹn, do đó, bạn có thể kiểm tra xem - và chỉ cần xóa /media/admin/my_data... (Trong trường hợp chung, tôi nghĩ rằng mv -nbiến thể là cách tiếp cận an toàn - nó xử lý tất cả các dạng mv, bao gồm cả ví dụ mv /media/admin/my_data/* my_data_on_60GB_partition/ .)

Có lẽ bạn sẽ cần khôi phục một số quyền; bạn có thể làm điều đó hàng loạt sử dụng chownchmod, hoặc khôi phục lại chúng từ các bản sao lưu sử dụng getfaclsetfacl(nhờ Sato Katsura cho lời nhắc nhở ).


Cảm ơn bạn Stephen Kitt, đó là một sự giúp đỡ rất lớn! Tôi có thể sử dụng findđể tìm và thiết lập quyền. Có rất nhiều tệp trong thư mục mới có khoảng trắng trong tên tệp, nhưng không có tệp nào bị ẩn - mà tôi biết. Bạn có nghĩ rằng toàn cầu trong lệnh sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/sẽ mở rộng tên tệp mà không gặp sự cố chia tách từ không? Tôi đã suy nghĩ thay thế tôi có thể sử dụng sudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/mà tôi tin rằng sẽ xử lý các đường dẫn tệp có khoảng trắng?
the_velour_fog

6
Để chắc chắn, khi những điều như OP mô tả xảy ra, tôi sử dụng rsyncthay vào đó, vì vậy nó cũng sẽ kiểm tra tính toàn vẹn của tất cả các tệp. Nhưng thật tuyệt khi biết rằng tôi không cần điều đó.
Hauleth

1
@the_velour_fog globalbing xử lý khoảng trắng trong tên tệp mà không gặp sự cố.
Stephen Kitt

5
Tôi su command mv -i ...(hoặc su /bin/mv -i ...), thay vì sudo mv -i ...), trong trường hợp một số quản trị viên (kỳ lạ) đã tạo "mv" một chức năng "mv -f" ở cấp hệ thống (ví dụ: / etc / profile hoặc các tệp toàn hệ thống như vậy) .. Lệnh một cái gì đó: bắt đầu lệnh somthing, và không phải là một hàm hoặc bí danh cùng tên. (ví dụ: người ta có thể (rất!) không may mắn và có một (rất, rất tệ!) function mv { /bin/mv -f -- "$@" }trong một tệp luôn có nguồn gốc, và sau đó "rm -i một cái gì đó" sẽ không hỏi bất cứ điều gì (và chỉ phản đối rằng "-i "Tập tin không tồn tại!) ... [Tôi đã thấy những thứ như vậy ... rùng mình ]
Olivier Dulac

3
@OlivierDulac - một ví dụ hoàn hảo về lý do tại sao sử dụng bí danh hoặc tập lệnh có cùng tên với các chương trình tiêu chuẩn.
Joe

19

Sau khi nhận được câu trả lời của Stephen Kitt và thảo luận về lệnh này như một giải pháp tiềm năng:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

Tôi quyết định không chạy nó cho đến khi tôi hiểu được những gì đang xảy ra, câu trả lời này mô tả những gì tôi phát hiện ra và cuối cùng làm.

Tôi đang sử dụng Gnu mvsao chép tệp vào mục tiêu, sau đó chỉ khi thao tác sao chép thành công, nó sẽ xóa bản gốc.
Tuy nhiên, tôi muốn xác nhận xem có mvthực hiện trình tự chuỗi này một lần hay không, nếu đó là sự thật, nội dung thư mục gốc sẽ được cắt thành hai phần, một phần được chuyển đến đích, phần còn lại vẫn bị bỏ lại tại nguồn. Và có thể sẽ có một tệp bị gián đoạn trong quá trình sao chép chung giữa hai thư mục - và nó có thể sẽ bị sai.

Để khám phá các tập tin phổ biến giữa hai thư mục, tôi đã chạy:

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

Kết quả này cho thấy có 14.237 trường hợp của cùng một tệp trong cả thư mục nguồn và thư mục đích, tôi đã xác nhận bằng cách kiểm tra các tệp theo cách thủ công - vâng, có nhiều tệp giống nhau trong cả hai thư mục. Điều này cho thấy rằng chỉ sau khi mvsao chép những tập tin lớn thì nó mới thực hiện việc xóa các tập tin nguồn. Một tra cứu nhanh infovề mvlệnh cho thấy

mvTrước tiên, nó [ ] sử dụng một số mã tương tự được sử dụng cp -ađể sao chép các thư mục và tệp được yêu cầu, sau đó (giả sử bản sao thành công), nó sẽ xóa bản gốc. Nếu sao chép thất bại, phần được sao chép vào phân vùng đích sẽ bị xóa.

Tôi đã không chạy lệnh nhưng tôi nghi ngờ nếu tôi cố chạy

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

Lời -i nhắc trước khi ghi đè có thể đã kích hoạt hơn 14.000 lần.

Vì vậy, sau đó để tìm hiểu có bao nhiêu tập tin trong thư mục mới được tạo:

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

Vì vậy, nếu có tổng số 14238 tệp thông thường trong thư mục mới và 14237 có bản gốc giống hệt trong nguồn, điều đó có nghĩa là chỉ có một tệp trong thư mục mới không có tệp giống hệt tương ứng trên nguồn. Để tìm hiểu tập tin đó là gì, tôi đã chạy rsync trở lại theo hướng của nguồn:

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

Kiểm tra nhanh đã xác nhận rằng đây là tệp không đúng định dạng, trong đó tệp tồn tại trên cả nguồn và đích, tệp đích = 64MB, gốc = 100MB. Tập tin này và hệ thống phân cấp thư mục của nó vẫn được sở hữu bởi root và chưa được khôi phục quyền ban đầu.

Vì vậy, tóm lại:

  • tất cả các tệp mvkhông bao giờ đạt được vẫn quay lại vị trí ban đầu của chúng (rõ ràng)
  • tất cả các tệp mvđã sao chép hoàn toàn vẫn có bản sao gốc trong thư mục nguồn
  • tập tin chỉ được sao chép một phần vẫn có bản gốc trong thư mục nguồn

Nói cách khác, tất cả các tệp gốc vẫn còn nguyên và giải pháp trong trường hợp này là chỉ cần xóa thư mục mới!


Wow ... Tôi đã cập nhật câu trả lời của mình, -nsẽ tốt hơn trong trường hợp chung. Tôi đã kiểm tra mvmã nguồn, nó xóa một đối số nguồn một lần.
Stephen Kitt

@StephenKitt ah tốt đẹp. Tôi đã tự hỏi khi mvxóa trên nguồn. Vì vậy, lệnh mv foo bar bazsẽ di chuyển foođến baz/foo sau đó xóa bản gốc foosau đó di chuyển barđến baz/bar..?
the_velour_fog

Vâng đúng vậy; trong thực tế, đó là những gì POSIX chỉ định (về cơ bản, do đó, bất kỳ lỗi nào ảnh hưởng đến bất kỳ đối số nguồn nào đều giữ nguyên toàn bộ phân cấp nguồn).
Stephen Kitt

Tôi nghĩ rằng bạn có thể đã sử dụng diff để tìm một tập tin chưa hoàn thành.
StarWeaver

1
Bạn nên sử dụng cmphơn là diffđể so sánh các tệp nhị phân. Ngoài ra, cuộc thảo luận của bạn ở trên chỉ có ý nghĩa khi di chuyển tệp trên các hệ thống tệp khác nhau. Không có sao chép liên quan khi di chuyển các tệp trong cùng một hệ thống tệp.
Satō Katsura

4

Tôi chỉ nghĩ rằng tôi nhận xét rằng một số người có thể muốn ném 'xargs' vào hỗn hợp để chạy mọi thứ song song. Điều đó mang lại cho tôi những ý chí và tôi thực sự thích giải pháp rsync ở trên.

Đối với các công cụ hệ thống tập tin về việc di chuyển và sao chép và khi chính xác bản gốc bị xóa, VFS và (các) hệ thống tập tin cơ bản phối hợp để đảm bảo tính nguyên tử cho mỗi tập tin trước khi đến bước xóa đó. Vì vậy, ngay cả khi nó bị gián đoạn trước khi tệp đích được ghi hoàn toàn, tất cả các khóa trong VFS là rất nghiêm ngặt và bảo vệ chống lại những thứ như dữ liệu ngẫu nhiên xen kẽ ngay cả trong các trường hợp song song. (Tôi đã làm việc trên Linux VFS và NFS4)

Việc thêm 'xargs' vào hỗn hợp có lẽ sẽ khiến bước kiểm tra độ tỉnh táo trở nên đau đầu, với nhiều tệp trong quá trình trung chuyển. Tôi ước tôi có nhiều kịch bản cấp hệ thống hơn. Lời nhắc tốt cho tôi!

Yêu câu hỏi, tốt cho mạng nhện và khiến tôi yêu rsync một lần nữa. Chúc mừng!


1
Chưa kể những rắc rối khi tên tập tin chứa khoảng trắng.
tự đại diệ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.