为什么 rsync 会从服务器重新下载本地已存在的未下载的文件?

为什么 rsync 会从服务器重新下载本地已存在的未下载的文件?

我想用它rsync从服务器下载文件到我的本地计算机。这当然没问题:

$ rsync --progress -vr server-user@my-server:/path/to/remote/dir/ /local/dir/

receiving incremental file list
file1.txt
       0 100%    10.00MB/s    0:01:00 (total: 0%) (xfer#1, to-check=n-1/n)
file2.txt
       0 100%    10.00MB/s    0:01:00 (total: 1%) (xfer#2, to-check=n-2/n)
... 
fileN.txt
       0 100%    10.00MB/s    0:01:00 (total: 100%) (xfer#n, to-check=0/n)

虽然这在第一次下载时运行良好,但我注意到,当rsync再次运行相同的命令时,现存的文件再次被重新下载,即使它们已经没有改变

$ rsync --progress -vr server-user@my-server:/path/to/remote/dir/ /local/dir/

receiving incremental file list
... 
fileN.txt
       0 100%    50.00MB/s    0:0:10 (total: 100%) (xfer#n, to-check=1/n+1)   // <-- fast re-download
newFile.txt
       0 100%    10.00MB/s    0:1:00 (total: 100%) (xfer#n, to-check=0/n+1)   // <-- new file

虽然重新下载现有文件比首次下载新文件要快得多,但仍然需要一些时间。这肯定比简单比较时间戳和大小所需的时间要多得多。此外,输出还显示下载进度。

那么,这里到底发生了什么?我以为rsync会通过比较时间戳和文件大小(或使用选项时使用文件哈希-c)自动检测现有文件并仅传输已更改和新的文件?

显然这里不是这种情况,因为在包含多个 1GB 以上文件的远程目录上重新运行该命令需要几分钟。因此这里传输了一些东西,但是什么呢?

添加该--ignore-existing选项会停止重新下载现有文件,重新运行命令只需几秒钟。这表明,将远程文件与本地文件进行比较并不需要很长时间。但是,使用此选项并不能解决问题,因为它无法识别已更改文件不再...


长话短说:

如何使用 rsync 仅下载新的和更新的文件?

答案1

我已经找到了答案,并希望将问题保留在这里,以防有人遇到同样的问题:

只需添加-t保留时间戳的选项即可。如果没有此参数,则目标文件将使用当前时间戳创建。这显然与服务器上的时间戳不同,因此更改检测不起作用。

相关内容