ファイルシステム間のアトミックムーブを近似しますか?


16

Ubuntuの下でいくつかのファイルをあるファイルシステムから別のファイルシステムに移動する必要があります。ただし、少なくとも正しいファイル名ではない場合、ファイルが宛先で部分的または不完全なファイルとして存在しないことが非常に重要です。

これまでのところ、私の唯一の解決策は、各ファイルを取得し、宛先で一時的な名前にコピーし、宛先でファイル名を元のファイル名に変更し(原子的であると信じています)、最後に元のファイルを削除するスクリプトを書くことです。

ただし、スクリプトの作成とデバッグは、このタスクにとってはやり過ぎのようです。既にネイティブにこれを行う方法またはツールはありますか?


8
xyの問題を感じます。なぜこれが必要なのですか?
ヘニング-モニカを

3
@henning考えられる理由はたくさんあるので、これは良い質問です。たとえば、特定の正規表現に一致するファイル名を持つファイルを自動的に処理しようとするプログラム(ただし、官僚的な理由で一時的に無効にすることはできません)。または、ファイルを取得して耐久性のある書き込み専用メディアに保存するバックアップシステムかもしれません。
wizzwizz4

1
@henning必要なのは、いくつかの異なるストレージから読み取る多くのキャッシュがあるためですが、1つは容量に近づいており、サービスから削除する必要があります。したがって、いずれかの場所にファイルが存在する場合、各ファイルは完全で完全である必要があります。そうしないと、キャッシュが不完全なファイルを取得(および保持)する可能性のある転送の開始と終了の間に競合状態が存在します。
Niels2000

回答:


27

rsync一時ファイル名にコピーします(たとえば、Rsync一時ファイル拡張子を参照してください。--inplaceオプションを使用しない限り、一時ファイル rsync-転送中に一時ファイルを作成しますか?)。ファイルが正常に転送された後にのみ、ファイル名を変更します。 rsyncまた、部分的にのみ転送された宛先ファイルも削除します(たとえば、ディスクがいっぱいになったなどのエラーにより)。

もあります --remove-source-filesソースファイルが正常に転送された後に削除オプションます。詳細については、rsyncmanページを参照してください。

それをすべてまとめると、次のようなものを使用できます。

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

このオプションは、「着信」キューからファイルを移動したり、ファイルが処理されるディレクトリに類似したりするようなタスクに特に役立ちます。

あるいは、これが1回限りのミラーでrsyncある--remove-source-files場合は、オプションなしで使用することもできます。必要に応じて、後でソースファイルを削除できます。


仕事に適したツールがあると思いました。ありがとう!
Niels2000

@ Niels2000私は以前にそのrsyncオプションを使用したことがあるかどうか覚えていませんが、あなたが望んでいたことはrsyncできることのように聞こえ--inplaceました。でman rsync見つかった--remove-source-filesrsyncほとんどすべてのファイル転送タスクを最初にチェックするのに適したツールです。
cas
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.