在文件少于 24 小时的两个文件夹之间递归同步文件

在文件少于 24 小时的两个文件夹之间递归同步文件

我想找到一个目录下24小时内的所有文件,然后将这些文件与另一台服务器同步。

有一些旧文件我不想传输,但是如果这些旧文件更新了,我就会这样做。

我正在考虑编写一个带有以下内容的脚本: find 和 -ctime 参数并将输出重定向到文件,但我不知道如何让 rsync 有效地使用它,或者是否有更好的方法来传输一组过去 24 小时内更改过的文件。

这个过程需要非常频繁地运行,所以我不想寻找效率太低的东西。 (例如使用 ftp 并每次发送所有内容)。

任何想法表示赞赏。

答案1

尝试这个:

cd /some/dir && rsync -av --files-from=<(find . -mtime 0 -printf "%p\n") <other stuff>

它用流程替代 <( )find命令替换为命名的 fifo,并提供该 fifo 的名称以将rsync其读取为要包含在同步中的内容。

更新

根据凯尔的回答,显然--files-from比 更合适--include-from;尽管两者都会起作用。答案已更新

答案2

#!/bin/sh
thefiles=/tmp/files.$$
LOCALDIR=/path/to/local/dir
REMOTEDIR=/path/to/remote/dir
REMOTEHOST=remote.host
changetime=24h

cd $LOCALDIR || { echo cd failed 1>&2; exit 1; }

trap 'rm -f $thefiles' 0

find . -type f -ctime -$changetime -print > $thefiles
rsync -v -n --archive --files-from=$thefiles . $REMOTEHOST:$REMOTEDIR

该脚本运行 find in $LOCALDIR,将结果转储到文件中,然后告诉 rsync 使用文件内容作为文件列表来传输到主机 $REMOTEHOST 上的目录 $REMOTEDIR。脚本 chdir 进入 $LOCALDIR 中,因为 rsync 命令需要相对路径,而不是绝对路径。我在 rsync 参数中留下了 -v -n ,这样你就可以看到它的作用,而无需复制任何内容;当您对脚本执行您想要的操作感到满意时,删除 -n 。

相关内容