我可以 rsync 到我的远程计算机,但无法从我的远程计算机 rsync - 它似乎没有在那个方向交换文件列表,因此它会尝试传输大量文件而不是仅更新已更改的新文件。
设置有点复杂。我有一台防火墙后面的远程计算机,需要从我的家用计算机与该计算机交换文件。家用计算机没有永久 IP 地址,因此我使用noip
反向 ssh 反弹到我家用计算机的当前 IP 地址。我的远程计算机正在运行的反向 ssh 命令是:
autossh -g -R 45678:localhost:22 [email protected]
在我的家用电脑上,我正在运行一个noip2
程序,告诉 noip.net 将端口 45678 反弹到我的家用电脑。
在我的家用电脑上,我可以使用以下方式将我的文档文件夹同步到我的远程计算机:
rsync -navzu --stats -e "ssh -p 45678" --delete /home/me/Documents/ me@localhost:/home/me/Documents
一切正常。只有新文档或已更新的文档才会被传输,并且远程计算机也会保持最新状态。
但是,当我尝试使用以下命令从远程计算机反向更新家庭计算机时,它不起作用:
rsync -navzu --stats -e "ssh -p 45678" --delete me@localhost:/home/me/Documents/ /home/me/Documents
rsync 看到没有任何我家用电脑上的文档中的文件,并尝试在试运行中传输每个文件。
知道这里是什么问题吗?
答案1
好吧,看起来我找到了我的问题的答案,尽管问题不是我所想的那样。
我有机会仔细查看了 rsync 尝试传输的文件。结果发现并不是所有文件,而是绝大多数文件。显然,在创建远程文件系统时,没有使用开关来确保保留日期时间戳。因此,所有文件都以在远程系统上创建文件的日期时间戳进行复制。只有此后更新过的文件才具有不同的时间戳。因此,当 rsync 尝试从远程系统更新本地系统时,它会尝试复制几乎所有文件,因为它们在远程系统上的时间戳比在本地系统上的时间戳更新。
因此,解决此问题的方法是使用 touch 在远程系统上放置正确的时间戳。我对 Linux Shell 不太熟悉,所以可能有一个更优雅的解决方案,但以下是对我有用的方法:
#1:在本地挂载远程文件系统:
sshfs -p 45678 me@localhost:/ ./mntpt/
#2:将以下 shell 脚本放在远程文件系统上并运行它:
#!/bin/bash
find * -newermt "2014-04-22" ! -newermt "2014-04-23" | while read f;
do
touch "$f" -c -m -r "/home/me/Documents/$f"
done
上述操作仍然需要很长时间才能运行,但几乎肯定不会像通过较慢的连接尝试备份所有文件那样耗时。我尝试了各种单行 shell 命令解决方案而不是脚本,但找不到在 touch 命令中两次引用文件列表的方法。