rsync 文件比上次 rysnc 运行的更新

rsync 文件比上次 rysnc 运行的更新

我尝试让 rsync 只同步自上次运行以来已更改或已创建的文件。这是为了阻止我的 NAS 服务器磁盘在每次 rsync 运行时旋转,即使没有文件要复制。

我认为设置上次运行时间的最简单方法是触摸标记文件。我可以这样做。我遇到的问题是让 rsync 只同步比标记文件更新的文件。我认为 rsync 没有 -newer 选项。我假设我可能需要运行一些其他命令来创建包含列表,但我是真正的 *nix 菜鸟。

如果重要的话,脚本将在 slackware 的 unRAID 版本上运行。

答案1

您的问题的这一部分似乎存在缺陷:

“这是为了阻止我的 NAS 服务器磁盘在每次 rsync 运行时旋转,即使没有文件可以复制。”

如果磁盘不旋转,您将如何检查存储在其上的文件的较新版本?rsync只会同步较新的或在源上已更改的文件(除非使用非默认选项,如-c, --checksum skip based on checksum, not mod-time & size

如果您不想让磁盘旋转,您可以像您所说的那样,在另一个始终旋转的磁盘上使用标记文件。因此,您可以编写一个简单的 bash 脚本来将它们拼凑在一起,但在我看来,这听起来像是错误的方法。

答案2

rsync您的解决方案是仅在需要运行时才启动。编写一个脚本,检查源上是否有较新的文件,如果有,则启动rsync


一个非常简单的 cron-ready 示例脚本

find假设 cron 作业每 60 分钟运行一次,源和目标都在本地安装,请进行相应调整(包括和的路径rsync(使用which findwhich rsync获取此信息):

#!/bin/bash
FIND=/usr/bin/find
RSYNC=/usr/bin/rsync
SOURCE=/sourcedir
TARGET=/targetdir
INTERVAL=60
FILELIST=/tmp/filelist.$(date +%s)


cd $SOURCE
$FIND . -type f -mmin -$INTERVAL > $FILELIST
cat $FILELIST

if [ $(cat $FILELIST | wc -l) -ne "0" ]
then
   $RSYNC -av --files-from=$FILELIST $SOURCE/ $TARGET/
fi
rm -f $FILELIST

答案3

尝试使用带有 -u 选项的 rsync,仅同步已修改的文件。仍然会导致磁盘旋转,但会减少实际执行时间。

答案4

您应该使用 lsyncd 甚至 inotifywait + scp,但这需要更多的脚本。

同步

lsyncd 使用 inotify 来检测是否有任何新的/修改的文件,然后使用 rsync+ssh 传输文件。

通知等待

如果lsyncd太复杂,可以使用inotifywait,例如:

while read line
do
    echo "$line"
done < <(inotifywait -mr "/dir/to/monitor/")

(您需要将 echo 部分更改为 scp)

同步

如果您使用 rsync,您可以使用“find”命令限制 rsync 应该检查哪些文件,例如:

cd /source/dir/
rsync -ravhz --files-from=<(find . -mtime -1) ./ /target/dir/

上述 rsync 不应检查修改/创建时间超过一天的文件。

免责声明:我尚未测试上述内容!请小心!

相关内容