rsync 选项排除部分文件

rsync 选项排除部分文件

我们用来rsync同步同一台计算机上的两个文件夹。

文件将从另一个应用程序写入源文件夹。我们遇到的问题是,即使文件没有完全写入/复制到源文件夹,rsync 也会将该文件复制到目标。

有什么方法/选项可以检查/转移仅有的源文件夹中的完整文件

答案1

排除部分文件是不可能的,因为不存在这样的概念。一旦生产者创建了文件,该文件就存在,但它一开始是空的,然后逐渐被填满。

您可以测试文件是否打开以进行写入;那会告诉你它不完整。然而,这是不可靠的:如果生产者崩溃(进程崩溃或整个系统崩溃),您将得到一个看起来完整的不完整文件。

您应该做的是为生产者定义一个协议来将文件标记为完整。执行此操作的正常方法(而且几乎是唯一明智的方法)是生产者在临时位置创建文件,然后在完成后将其移动到位(使用rename系统调用或shell 命令)。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提供了这一点。

或者,您可以使用fuserlsof检查应用程序是否在开始传输时写入文件:

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/"

相关内容