Rsync:仅在时间戳复制


42

目前,我有两个目录A /和B /,除了时间戳外,每个目录都相同。因此,如果我运行命令:

rsync --dry-run -crvv A/ B/

然后所有文件都标记为“最新”,而命令:

rsync --dry-run -rvv A/ B/

显示所有文件都将从A /复制到B /。

我的问题是:鉴于我知道文件是相同的(就内容而言),那么有什么办法(通过rsync或其他方式)将B /中的文件的时间戳设置为与B /中的文件的时间戳相同。 A /,而不是将所有文件从A /复制到B /?

谢谢


如果您知道文件是相同的,那么为什么不花钱就不复制它们以获得所需的日期/时间戳?
蒂姆(Tim)

3
@Tim:也许有很多数据。
理查德

Answers:


75

使用-t(保留时间戳),--size-only只会比较文件大小。如果大小匹配,则rsync将不会复制文件,但由于-t已指定,因此它将更新目标文件上的时间戳,而无需重新复制。

确保不使用-u(更新),因为这将跳过已经存在的文件并完全跳过更新时间戳。

我最初没有使用rsync将一堆文件复制到新驱动器的问题,因此时间戳被更新为当前时间。我使用下面的命令在相当长的时间内正确同步了所有内容:

rsync -vrt --size-only /src /dest

2
我还建议添加--existing以防止意外复制新文件。
导致

1
该标志--archive(或-a)包括-r-t更:)
多尔

6

如果大小匹配,使用--size-only将导致rsync跳过比较文件时间戳(以及文件内容)。将此与--times结合使用,可以将时间戳克隆到目标树中。


3

我认为rsync是实现此目的的正确工具,但是如果您想要一些脚本来完成此任务,那可以给一个好的开始。

您可以获得带有时间戳(访问时间)的文件列表,如下所示:

find . -printf '"%p" %a\n' -type f > /tmp/times

并从中获取适当的时间更新命令:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

它不是一个完整的脚本,而是一个很好的起点!


谢谢。我想我暂时可能会坚持使用Rsync,但是我一定会上网并学习脚本的不同组件,因为它将来可能会有用。
artella 2011年

那似乎正是我的解决方案!我想保留时间,同时将一些元数据添加到我的音乐库中。但是,显然它不能处理文件名中的空格):
Burcardo

2

使用(例如/path/to/source)目录作为touch命令的参考。只cd到您的目标目录并执行

find -type f -exec touch -r /path/to/source/{} {} \;

您无法使用rsync复制亚秒级时间戳(尚未)。

这也适用于目录和伪文件(只需删除或更改-type f


这对我很有用,因为我需要一段时间才能复制。我注意到它不会复制ctime,在我的情况下还可以。
snapfractalpop

只需阅读“触摸”的手册页。您可以使用此命令同时设置atime和mtime。
挪威克(Marok)

是的,我知道您可以使用,touch -ar但仍然不会更改ctime。我想这是很少需要的。
snapfractalpop

嗯,我现在看到了问题。谢谢。是的,ctime很难更改,我也不知道为什么。
挪威克(Marok)

1

好吧,您当然可以编写一个脚本,该脚本从一侧读取时间戳,然后使用触摸将其设置在另一侧的同一文件上。

但这可能会使您花费更多的时间,而不仅仅是让rsync尝试复制所有文件。实际上将很少传输数据(如果文件确实相同,则仅使用块哈希)。但是每个文件的全部内容至少必须在每一侧都读取。因此,您受到磁盘带宽或IOPS的限制,这可能需要一段时间。但是仍然可能比编写和测试脚本所需的时间更少。


谢谢,我没有意识到rsync的这一功能(也在Wikipedia中进行了讨论)。
artella 2011年

0

对于像我这样想要修改文件并希望保留原始时间戳的人(例如,您更新音乐库的meta标签)。

它基于Stone提供的解决方案。但是,这里是有关修改时间和恢复时间戳的工作脚本。首先执行第一步,然后开始处理文件。

  1. 保留旧的时间戳记。它从当前目录运行,排除所有隐藏文件,并将其保存到中的临时文件/tmp/files。您始终可以更改参数,但最好保留它,-printf '"%t" "%p"\n'因为后面的touch命令会利用它。

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. 修改文件就像你喜欢

  3. 现在创建一个文件,以帮助您恢复时间戳:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. 最后将旧日期应用于修改后的文件

    sh job.sh

警告:适用于带有名称间隔,特殊字符的文件,但例如不包含带有$符号的文件。


为避免文件名中的反斜杠出现(某些)问题,请使用read -r line。好吧,请始终read与结合使用-r。此外,您可以避免打开job.sh每个文件。只需将重定向放在命令的末尾:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

第二个警告:此脚本不传输目录的时间戳。(好吧,OP并没有要求。)
hagello

0

在Windows上仅复制时间戳的最佳方法:

要将任何文件的最后创建/修改/访问的时间戳复制到另一个,可以使用:

触摸/ c / m / a / r SourceFile DestFile

(此版本的Touch是Win32 Console ToolBox http://www.stevemiller.net/apps/的一部分

Robocopy“ SOURCE_DIRECTORY”“ DESTINATION_DIRECTORY” / E / COPYALL / DCOPY:DAT / XF / R:10 / W:5 / V / ETA


-1

rsync手册:man rsync列出了-tand -N开关,可能值得摆弄。


我看不到-N。您为什么仍然推荐这些?
汤姆·黑尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.