一部のファイルを除外するrsyncオプション

一部のファイルを除外するrsyncオプション

rsync同じコンピュータにある2つのフォルダを同期するために使用します。

ファイルは他のアプリケーションのソースフォルダに書き込まれます。私たちが持っている問題は、ファイルがソースフォルダに完全に書き込まれていない場合でも、rsyncがファイルをターゲットにコピーすることです。

確認/転送する方法/オプションはありますか?ただソースフォルダのフルファイル

答え1

そのような概念が存在しないため、部分ファイルを除外することは不可能です。クリエイターがファイルを作成すると、ファイルは存在しますが、最初は空になってから徐々に入力されます。

ファイルが書き込み用に開いていることをテストすると、ファイルが不完全であることがわかります。しかし、これは信頼できません。プロデューサーがクラッシュすると(プロセスがクラッシュした場合、またはシステム全体がクラッシュした場合)、完全に見える不完全なファイルが生成されます。

あなたがしなければならないのは、プロデューサーがファイルを完了としてマークするためのプロトコルを定義することです。これを行う一般的な方法(そしてほぼ唯一の合理的な方法)は、クリエイターが一時的な場所にファイルを作成し、rename作業が完了したらそのファイルをその場所(システムコールまたはシェルコマンドを使用して)に移動することです。mv

命名規則を使用できます。

  • プロデューサー:を書き$FILENAME.tmp、最終ファイルに移動します。

    generate_data >"dir/$FILENAME.tmp"
    mv "dir/$FILENAME.tmp" "dir/$FILENAME"
    
  • 消費者:.tmpファイルを除外します。

    rsync -a --exclude='*.tmp' dir remote:
    

または、準備ディレクトリを使用できます。

  • プロデューサー:準備ディレクトリに書き込み、最終位置に移動します。

    generate_data >"dir/staging/$FILENAME"
    mv "dir/staging/$FILENAME" "dir/"
    
  • 消費者:準備ディレクトリを除外します。

    rsync -a --exclude='/staging' dir remote:
    

答え2

ファイルサイズが固定されている場合(アプリケーションの書き込み操作後)、サイズのみに基づいてファイルを転送できるため、書き込みが完了していないファイルはコピーされません。

--max-size=SIZE         don't transfer any file larger than SIZE
--min-size=SIZE         don't transfer any file smaller than SIZE

オプションはrsyncこれを提供します。

または、転送を開始するときにアプリケーションがファイルに書き込むかどうかを使用または確認fuserできます。lsof

if fuser /path/to/file.txt >/dev/null 2>&1; do
    rsync ....
else
    sleep 10
fi

答え3

過去30分間に変更されていないすべてのファイルを見つけるために、次のコマンドを使用しました。

ssh sourceServer "find sourceDir -mmin +30 -type f | xargs -i -r rsync [ --remove-sent-files ] -aP {} destServer:destPath/"

関連情報