検索コマンドが複数のファイルをコピーできない

検索コマンドが複数のファイルをコピーできない

最後の瞬間に生成されたファイルをコピーするには、次のコマンドを使用しています。このコマンドを含むスクリプトを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/

関連情報