Rsync(无需复制时间戳)

Rsync(无需复制时间戳)

使用rsync命令,我只想将更改的文件/文件夹复制/同步到目标文件夹。每当执行命令时,我都会遇到类似 Rsync 的问题,rsync命令也会与时间戳一起复制。

例如,我的目标文件夹“Linux”已于 1 个月前更新,在我的源文件夹中没有“Linux”文件夹的更新信息,但当我执行命令时,rsync我的目标“Linux”文件夹时间戳已更新为最新的源文件夹时间戳。我不想复制时间戳。请对此提出建议,并请浏览一下我使用过的以下命令。

rsync -avh /source/Linux/ /destination/Linux/ 

rsync -uan /source/Linux/ /destination/Linux/

rsync -uav /source/Linux/ /destination/Linux/

答案1

选项-a( --archive) 意味着-t选项 ( --times,“保留修改时间”)。

--no-t您可以使用或取消此选项--no-times -a:

rsync -a --no-t /source/Linux/ /destination/Linux/

这不会将源时间戳复制到目标。但请注意,它rsync会比较时间戳(和其他元数据)以确定文件是否已更新并且需要复制。因此您可能也想使用-u( --update)。

答案2

一般来说,你应该复制时间戳,因为这样可以rsync在将来更有效地运行。

但有时您可能真的不想保持时间戳同步。例如,git不断更改文件上的时间戳,但是当您运行 rsync 时,您不想看到这些时间戳被传输,而只想查看真正更改的文件。

--no-times将避免复制时间戳,但如果文件更新后,目标文件的修改时间将设置为现在。这意味着时间戳现在会有所不同,因此下一个rsync会认为需要更新,并将再次发送!

为了避免这种情况,--ignore-times 不会有帮助,因为它会导致所有文件被更新。

你可以做的是 use --checksum,这对于 rsync 来说是一项艰苦的工作,但它会做你想做的事:它会忽略时间戳,并且仅更新文件(如果其实际情况)内容已改变。

所以你可能想使用这样的命令:

rsync -i -a --no-times --checksum /source/Linux/ /destination/Linux

替代方法

如果你想保持 rsync 高效,那么你应该保持时间戳同步。

但如果您不想看到更新仅有的时间戳更改,然后您可以从输出中隐藏这些:

rsync -ai /source/Linux/ /destination/Linux |
grep --line-buffered -v '^.[fd]\.\.t\.\.\.\.\.\. '

请注意,如果您采用这种方法,您将获得grep的退出代码,而不是rsync的!所以这可能不适合脚本编写,因为退出代码可能会产生误导。您可以使用以下方法解决该问题管道故障或管道状态

最后,我用了这个:

rsync_ai_with_quiet_timestamps() {
  # This will not send timestamps, and not check timestamps, but it is slow
  #rsync -a --no-times --checksum -i "$@"

  # This will send timestamps, but hide updates which are only timestamp changes
  (
    set +e
    rsync -ai "$@" |
    grep --line-buffered -v '^.[fd][.][.]t[.][.][.][.][.][.] '
    exit "${PIPESTATUS[0]}"
  )
}

...

rsync_ai_with_quiet_timestamps /source/Linux/ /destination/Linux

相关内容