我尝试让 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 find
和which 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 不应检查修改/创建时间超过一天的文件。
免责声明:我尚未测试上述内容!请小心!