Mendekati perpindahan atom melintasi sistem file?

16

Saya harus memindahkan beberapa file dari satu sistem file ke yang lain di bawah Ubuntu. Namun, sangat penting bahwa file tidak pernah ada sebagai file parsial atau tidak lengkap di tujuan, setidaknya tidak dengan nama file yang benar.

Sejauh ini, satu-satunya solusi saya adalah dengan menulis skrip yang mengambil setiap file, menyalinnya ke nama sementara di tujuan, kemudian mengganti nama (yang menurut saya harus atomis) di tujuan ke nama file asli dan akhirnya menghapus file yang berasal .

Namun, menulis dan men-debug skrip sepertinya terlalu berat untuk tugas ini. Apakah ada cara atau alat yang sudah melakukan ini secara asli?

Niels2000
sumber
8
Saya merasakan masalah. Mengapa Anda membutuhkan ini?
Henning - mengembalikan Monica
3
@menunggu Ada banyak alasan yang memungkinkan, jadi ini adalah pertanyaan yang bagus. Misalnya, sebuah program yang secara otomatis mencoba memproses file dengan nama file yang cocok dengan regex tertentu (tetapi tidak dapat sementara dinonaktifkan karena alasan birokrasi). Atau mungkin sistem cadangan yang mengambil file dan menyimpan kemudian pada media yang tahan lama tetapi hanya untuk menulis.
wizzwizz4
1
@menunggu saya membutuhkannya karena saya memiliki sejumlah cache yang membaca dari beberapa penyimpanan yang berbeda, tetapi satu sudah mendekati kapasitas dan perlu dihapus dari layanan. Oleh karena itu, setiap file perlu, jika ada di salah satu lokasi, harus lengkap dan utuh. Jika tidak, ada kondisi ras antara transfer yang dimulai dan berakhir di mana cache mungkin mengambil (dan menyimpan) file yang tidak lengkap.
Niels2000

Jawaban:

27

rsyncsalinan ke nama file sementara (mis. lihat ekstensi file sementara Rsync dan rsync - apakah itu membuat file temp selama transfer? ) kecuali Anda menggunakan --inplaceopsi. Itu mengubah nama mereka hanya setelah file telah berhasil ditransfer. rsyncjuga menghapus semua file tujuan yang hanya ditransfer sebagian (mis. karena disk penuh atau kesalahan lainnya).

Ada juga --remove-source-filesopsi yang menghapus file sumber setelah mereka berhasil ditransfer. Lihat rsynchalaman manual untuk lebih jelasnya.

Menyatukan semua itu, Anda bisa menggunakan sesuatu seperti:

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

Opsi ini sangat berguna untuk tugas-tugas seperti memindahkan file dari antrian "masuk" atau mirip dengan direktori di mana mereka akan diproses.

Atau, jika ini cermin sekali pakai, mungkin gunakan saja rsynctanpa --remove-source-filesopsi. Anda dapat menghapus file sumber nanti jika Anda mau / perlu.

cas
sumber
Saya pikir akan ada alat yang baik untuk pekerjaan itu. Terima kasih!
Niels2000
@ Niels2000 Saya tidak ingat apakah saya pernah menggunakan opsi rsync sebelumnya tetapi apa yang Anda inginkan terdengar seperti hal yang rsyncbisa dilakukan, dan saya tahu itu mentransfer file dengan nama temp (kecuali Anda menggunakan --inplace), jadi saya melihat masuk man rsyncdan ditemukan --remove-source-files. rsyncadalah alat yang baik untuk memeriksa dulu hampir semua tugas transfer file.
cas