如何用Rsync+Find同步远程今日0点以来的文件至本地?
解决Git Bash中同步远程今日修改文件到本地的问题
嘿,你原来的命令没法生效,核心问题是rsync不能直接通过管道接收find的输出当作待同步文件列表,得用专门的参数来处理这种场景。下面给你两种实用的解决方案:
方案一:兼容特殊字符的完整路径同步
这个方案能稳妥处理文件名包含空格、换行等特殊字符的情况,同步后会保留远程文件的完整绝对路径结构:
ssh user@192.168.1.100 'find /home/user/test/ -mtime -1 -type f -print0' | rsync --archive --verbose -zz --human-readable --from0 --files-from=- -e ssh user@192.168.1.100:/ '/e/rc/'
关键参数说明:
-print0:让find用空字符分隔文件名,避免特殊字符导致的解析错误--from0:告诉rsync用空字符分割输入的文件名列表,和-print0配对使用--files-from=-:指定rsync从标准输入(管道传递的内容)读取要同步的文件路径- 远程源写
/:因为find输出的是完整绝对路径,rsync会基于这个路径把文件同步到本地,比如远程/home/user/test/file.txt会同步到本地/e/rc/home/user/test/file.txt
方案二:保持远程目录相对结构同步
如果你想把远程/home/user/test/下的文件直接同步到本地/e/rc/(只保留test目录内的相对结构,不嵌套完整系统路径),可以调整find的输出格式:
ssh user@192.168.1.100 'cd /home/user/test && find . -mtime -1 -type f -print0' | rsync --archive --verbose -zz --human-readable --from0 --files-from=- -e ssh user@192.168.1.100:/home/user/test/ '/e/rc/'
这里的调整点:
- 先cd到远程的test目录,再从
.开始查找,输出相对路径 - rsync的远程源指定为
/home/user/test/,这样同步时会把相对路径对应到本地/e/rc/下,比如远程/home/user/test/sub/file.txt会同步到本地/e/rc/sub/file.txt
额外优化提示
如果要严格筛选今日0点之后修改的文件,-mtime -1是指24小时内的文件,要是服务器和本地时间一致没问题;如果想精确匹配当日零点,可以改用find的-newermt参数:
ssh user@192.168.1.100 'find /home/user/test/ -newermt "00:00" -type f -print0'
内容的提问来源于stack exchange,提问作者cs9112
相关产品推荐
相关产品推荐

