Dosya sistemleri arasında atomik hareketin tahmini?


16

Ubuntu altında bazı dosyaları bir dosya sisteminden diğerine taşımak zorundayım. Ancak, dosyaların en azından doğru dosya adı altında olmamak kaydıyla, hedefte hiçbir zaman kısmi veya eksik dosyalar olarak bulunmaması çok önemlidir.

Şimdiye kadar tek çözümüm, her dosyayı alan, hedefteki geçici bir isme kopyalayan, daha sonra (atomik olması gerektiğine inandığım) orijinal dosya adına yeniden adlandırdığı ve sonunda kaynak dosyayı silen bir komut dosyası yazmaktır. .

Ancak, bir komut dosyası yazmak ve hata ayıklamak, bu görev için gereğinden fazla gibi görünüyor. Bunu doğal olarak yapan bir yol veya araç var mı?


8
Bir xy problemi hissediyorum. buna ne için ihtiyacın var?
henning - Monica

3
@henning Pek çok olası neden var, bu yüzden bu iyi bir soru. Örneğin, belirli bir normal ifadeyle eşleşen dosya adına sahip dosyaları otomatik olarak işlemeye çalışan (ancak bürokratik nedenlerle geçici olarak devre dışı bırakılamayan) bir program. Ya da daha sonra dayanıklı ancak salt okunur medyada dosya ve depolama alan bir yedekleme sistemi olabilir.
wizzwizz4

1
@henning Buna ihtiyacım var çünkü birkaç farklı depodan okuyan bir dizi önbellek var, ancak bir kapasite yaklaşıyor ve hizmetten çıkarılması gerekiyor. Buna göre, her dosyanın, herhangi bir konumda varsa, tam ve sağlam olması gerekir. Aksi takdirde, bir önbelleğin eksik bir dosyayı yakalayabileceği (ve koruyabileceği) bir aktarım başlangıcı ve bitişi arasında bir yarış durumu vardır.
Niels2000

Yanıtlar:


27

rsyncseçeneği kullanmazsanız, geçici dosya adlarına kopyalar (örneğin bkz. Rsync geçici dosya uzantısı ve rsync - aktarım sırasında geçici dosya oluşturur mu? ) --inplace. Bunları yalnızca dosya başarıyla aktarıldıktan sonra yeniden adlandırır. rsyncayrıca yalnızca kısmen aktarılmış olan hedef dosyaları da siler (örneğin, disk dolu veya başka bir hata nedeniyle).

Ayrıca --remove-source-filesbaşarıyla aktarıldıktan sonra kaynak dosyaları silen bir seçenek de vardır . Daha rsyncfazla bilgi için kılavuz sayfasına bakınız.

Hepsini bir araya getirmek, şöyle bir şey kullanabilirsiniz:

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

Bu seçenek, dosyaları "gelen" bir kuyruktan veya işlenecek dizine benzer bir yere taşımak gibi görevler için özellikle yararlıdır.

Alternatif olarak, bu bir kerelik bir ayna ise, sadece seçenek rsyncolmadan --remove-source-fileskullanın. İsterseniz / isterseniz kaynak dosyalarını daha sonra silebilirsiniz.


İş için iyi bir araç olacağını düşündüm. Teşekkürler!
Niels2000

@ Niels2000 Daha önce bu rsync seçeneğini kullandıysam hatırlayamıyorum ama ne istersen rsyncyapabileceğin bir şey gibi geliyordu ve geçici bir isimle (kullanmadığınız sürece --inplace) dosya aktardığını biliyordum , bu yüzden baktım içinde man rsyncve bulunan --remove-source-files. rsynchemen hemen her dosya aktarım görevini kontrol etmek için iyi bir araçtır.
cas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.