Rsync:仅在时间戳上复制

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

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

那么所有的文件都标记为“uptodate”,而命令:

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

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

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

谢谢

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

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

    我有最初不使用rsync将一堆文件复制到新驱动器的问题,因此时间戳更新到当前时间。 我用下面的命令在正确的时间内正确地同步一切:

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

    使用–size-only将导致rsync跳过比较文件时间戳(因此文件内容)如果大小匹配。 将这个和时间结合起来可以将时间戳克隆到目标树上。

    我认为rsync是正确的工具,但如果你想要一些脚本来做到这一点,这可以给一个好的开始。

    你可以得到一个带有时间戳的文件列表(访问次数),如下所示:

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

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

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

    这不是一个完整的脚本,而是一个好的开始!

    那么,你当然可以编写一个脚本,从一侧读取时间戳,然后使用touch将它设置在另一侧的同一个文件上。

    但是,这可能需要比让rsync尝试复制所有文件更长的时间。 非常less的数据实际上将被传输(如果文件是完全相同的,只有块哈希)。 但是每个文件的全部内容至less要在每一个文件中被读取。 所以你受限于磁盘带宽或IOPS,可能需要一段时间。 但是,编写和testing脚本的时间可能还要less一些。

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

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

    您不能使用rsync(还)复制次秒时间戳。

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

    rsync手册: man rsync列出了一个-t-N开关,他们可能是值得摆弄的。

    对于像我这样打算修改文件并希望保留原始时间戳的人 (例如,更新音乐库的元标记)。

    它基于Stone提供的解决scheme。 但是,这里介绍修改时间和工作脚本来恢复时间戳。 首先做第一步,然后开始处理你的文件。

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

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

    2. 尽可能修改你的文件

    3. 现在创build一个帮助你恢复时间戳的文件:

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

    4. 最后将旧的date应用到修改的文件

      sh job.sh

    警告:适用于具有名称间距,特殊字符的文件,但是例如没有带有$符号的文件。

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

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

    touch / c / m / a / r SourceFile DestFile

    (此版本的Touch是Win32控制台工具箱http://www.stevemiller.net/apps/的一部&#x5206; )

    • 对于目录 :使用“robocopy”命令,使用GUIshellhttp://www.turnssoft.com/robocop-robocopy.html

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