最後の瞬間に生成されたファイルをコピーするには、次のコマンドを使用しています。このコマンドを含むスクリプトを1分ごとに実行して、ファイルがa / b / cの場所に作成されるとすぐにコピーするようにスケジュールします。ただし、このコマンドは時々1つ以上のファイルのコピーに失敗します。 findコマンドに欠点はありますか?それとも、次のコマンドにエラーがありますか?
find /a/b/c -type f -mmin -1 -exec cp {} /x/y/z \;
答え1
タイムスタンプフラグを使用すると、どのくらいの期間find
に関係なく、最後の実行以降のすべてのファイルをインポートできます。$trigger
定義をより適切なものに変更してください。
trigger=/tmp/trigger
touch "$trigger.new"
test ! -f "$trigger" && touch "$trigger"
find /a/b/c -newer "$trigger" -type f -exec cp -f {} /x/y/z +
mv -f "$trigger.new" "$trigger"
次の場合はまだ失敗します。時間ファイルの書き込みが完了した後にリセットされます。
ソースファイルへの書き込み中にこのコードが実行されている場合は、まだ失敗します。ソースファイルがアトミックに表示されることを保証できない場合は、これを防ぐ価値があります。これを処理する1つの方法は、.tmp
サフィックスを使用してファイルを作成し.part
、完了したら送信者が名前を変更することです。ここのトリガースクリプトは、名前が(または)で終わるファイルを除外するように変更されfind
ます。.tmp
.part
を使用することもできますが、rsync
ソースのディレクトリパスがターゲットにコピーされるため、目的の結果ではない可能性があることに注意してください。上記のコードを次の行に置き換えます。
rsync -a /a/b/c/ /x/y/z/