我在本地和服务器上都有一个文件。我首先尝试rsync
在“dry-run”模式下运行,看看文件之间是否存在一些差异:
$ rsync -aP --dry-run [email protected]:/home/dir .
[email protected]'s password:
receiving incremental file list
dir/myfile.txt
这显然意味着该文件dir/myfile.txt
不同,因为它将被更新。然后我用以下命令检查相同的文件diff
:
$ ssh [email protected] 'cat /home/dir/myfile.txt' | diff --report-identical-files - dir/myfile.txt
[email protected]'s password:
Files - and dir/myfile.txt are identical
因此,显然这些文件是相同的。
为什么rsync
要更新这个文件 - 我如何从命令行确认原因?
答案1
rsync
将报告更改
- 权限差异
- 时间戳差异
- 内容(和文件大小)差异
@roaima 在评论中指出,可以选择在rsync 手册页:
-i, --itemize-changes output a change-summary for all updates
你可能发现它很有用,尽管摘要很简洁并且(在我手头的版本中)仅报告了类型(文件、链接或目录)和姓名。以下是我在 Debian 7 和测试机器上使用 rsync 3.0.9-4 和 3.1.1-3 看到的结果:
cd+++++++++ backup-invisible-island/
>f+++++++++ backup-invisible-island/.bash_history
cL+++++++++ backup-invisible-island/conf -> ../system/invisible-island.net/conf
cL+++++++++ backup-invisible-island/statistics -> ../system/invisible-island.net/statistics
cd+++++++++ backup-invisible-island/anon_ftp/
cL+++++++++ backup-invisible-island/anon_ftp/AdaCurses -> pub/AdaCurses
cL+++++++++ backup-invisible-island/anon_ftp/DEBS -> pub/DEBS
cL+++++++++ backup-invisible-island/anon_ftp/GIT -> pub/GIT
对于我自己的使用而言,目录时间戳的更改相对不重要。我使用的脚本仅显示文件哪些已更改:
答案2
Rsync 会同步文件,除非它能够在不比较文件内容的情况下确定它们是相同的。如果它无法在不检查内容的情况下判断文件是否相同,它可能会同步文件并意识到没有任何差异。
默认情况下,如果两个文件具有相同的大小和相同的时间戳,rsync 会判定它们是相同的(因此会跳过读取其内容)。
两个文件相同时被视为不同的最常见原因是它们具有相同的内容,但时间戳不同,因为该文件是过去复制的,并且副本上的时间戳是副本的日期而不是原始文件的时间戳。例如,文件可能已使用scp
without -p
、 with rsync
without-p
或进行复制-a
,通过 Web 浏览器下载等。
如果时间戳不同,那么 rsync 无论如何都需要同步文件,因为您告诉它同步元数据 ( -a
)。因此,列表中的内容rsync -n
是完全合理的:rsync 有工作要做。无论如何,同步时间是一个好主意,因为这是安排 rsync 将来运行时知道没有什么可做的唯一方法。
答案3
请注意之前的答案 - 如果您发现 rsync 重复报告相同的文件已更改,则很可能是时间戳问题 - 某些文件系统(尤其是 FAT)存储精度较低的时间戳,因此 rsync 可能无法设置如果在不同文件系统之间同步,则具有相同的时间戳。
答案4
首先,找出原因。只需执行$ls -lau
并检查权限和时间戳差异即可。如果它们不同,那么这就是问题所在,您应该只传递-p
复制权限并-t
使用时间戳进行复制。
从您的使用情况来看,您似乎定期备份数据。一个名为“Timeshift”的程序在这方面做得很完美,但不幸的是它并不正式支持远程备份,但检查此建议以获取解决方法。