Rsync

rsync 選項排除部分文件

  • March 26, 2020

我們rsync用於在同一台機器上同步兩個文件夾。

文件將從另一個應用程序寫入源文件夾。我們遇到的問題是,即使文件沒有完全寫入/複製到源文件夾,rsync 也會將該文件複製到目標。

是否有任何方法/選項可以僅從源文件夾中檢查/傳輸完整文件

如果文件的大小是固定的(在應用程序的寫入操作之後),您可以只傳輸基於大小的文件,因此不會複製尚未寫入的文件:

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

選項rsync提供了這一點。

或者,您可以使用fuserlsof檢查應用程序是否在開始傳輸時正在寫入文件:

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

排除部分文件是不可能的,因為沒有這樣的概念。一旦生產者創建了文件,文件就存在了,但它一開始是空的,然後逐漸被填滿。

可以測試文件是否打開寫;那會告訴你它是不完整的。然而,這並不可靠:如果生產者崩潰(程序崩潰或整個系統崩潰),您將得到一個看起來完整的不完整文件。

您應該做的是為生產者定義一個協議以將文件標記為完整。執行此操作的正常方法(幾乎是唯一明智的方法)是讓生產者在臨時位置創建文件,然後在完成後將其移動到位(使用rename系統呼叫或mvshell 命令)。

您可以使用命名約定:

  • 生產者:寫入$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:

引用自:https://unix.stackexchange.com/questions/220540