Xấp xỉ di chuyển nguyên tử trên các hệ thống tập tin?


16

Tôi phải di chuyển một số tệp từ hệ thống tệp này sang hệ thống tệp khác trong Ubuntu. Tuy nhiên, điều rất quan trọng là các tệp không bao giờ tồn tại dưới dạng tệp một phần hoặc không đầy đủ tại đích, ít nhất là không dưới tên tệp chính xác.

Cho đến nay, giải pháp duy nhất của tôi là viết một tập lệnh lấy từng tệp, sao chép nó thành tên tạm thời tại đích, sau đó đổi tên nó (mà tôi tin là nguyên tử) tại đích đến tên tệp gốc và cuối cùng xóa tệp gốc .

Tuy nhiên, viết và gỡ lỗi một kịch bản có vẻ như quá mức cần thiết cho nhiệm vụ này. Có một cách hoặc công cụ đã làm điều này tự nhiên?


8
Tôi cảm thấy một vấn đề xy. Tại sao bạn cần điều này?
henning - phục hồi Monica

3
@henning Có rất nhiều lý do có thể, vì vậy đây là một câu hỏi hay. Ví dụ: một chương trình tự động cố gắng xử lý các tệp có tên tệp khớp với một biểu thức chính quy nhất định (nhưng không thể tạm thời bị vô hiệu hóa vì lý do quan liêu). Hoặc có thể là một hệ thống sao lưu lấy các tệp và lưu trữ sau đó trên phương tiện bền nhưng chỉ ghi.
wizzwizz4

1
@henning Tôi cần nó bởi vì tôi có một số bộ nhớ cache được đọc từ một số kho khác nhau, nhưng một cái gần hết dung lượng và cần phải được loại bỏ khỏi dịch vụ. Theo đó, điều cần thiết là mỗi tệp, nếu nó tồn tại ở bất kỳ vị trí nào, cần phải đầy đủ và nguyên vẹn. Mặt khác, tồn tại một điều kiện chạy đua giữa một lần chuyển bắt đầu và kết thúc trong đó bộ đệm có thể lấy (và giữ lại) một tệp chưa hoàn chỉnh.
Niels2000

Câu trả lời:


27

rsyncsao chép vào tên tệp tạm thời (ví dụ: xem phần mở rộng tệp tạm thời của rsyncrsync - nó có tạo tệp tạm thời trong khi chuyển không? ) trừ khi bạn sử dụng --inplacetùy chọn. Nó đổi tên chúng chỉ sau khi tập tin đã được chuyển thành công. rsynccũng xóa bất kỳ tệp đích nào chỉ được chuyển một phần (ví dụ do đĩa đầy hoặc lỗi khác).

Ngoài ra còn có một --remove-source-filestùy chọn xóa (các) tệp nguồn sau khi chúng được chuyển thành công. Xem rsynctrang người đàn ông để biết thêm chi tiết.

Đặt tất cả lại với nhau, bạn có thể sử dụng một cái gì đó như:

rsync -ax --remove-source-files source/ target/

Tùy chọn này đặc biệt hữu ích cho các tác vụ như di chuyển tệp ra khỏi hàng đợi "đến" hoặc tương tự như thư mục nơi chúng sẽ được xử lý.

Ngoài ra, nếu đây là gương một lần, có thể chỉ cần sử dụng rsyncmà không có --remove-source-filestùy chọn. Bạn có thể xóa các tệp nguồn sau nếu bạn muốn / cần.


Tôi nghĩ rằng sẽ có một công cụ tốt cho công việc. Cảm ơn!
Niels2000

@ Niels2000 Tôi không thể nhớ nếu tôi đã từng sử dụng tùy chọn rsync đó trước đây nhưng những gì bạn muốn nghe có vẻ giống như điều rsynccó thể làm và tôi biết rằng nó đã chuyển các tệp có tên tạm thời (trừ khi bạn sử dụng --inplace), vì vậy tôi đã xem trong man rsyncvà tìm thấy --remove-source-files. rsynclà một công cụ tốt để kiểm tra đầu tiên cho hầu hết mọi tác vụ truyền tệp.
cas
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.