目前我有两个目录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。 但是,这里介绍修改时间和工作脚本来恢复时间戳。 首先做第一步,然后开始处理你的文件。
保留旧的时间戳 。 它从当前目录运行,排除所有隐藏文件,并将其保存到/tmp/files
的临时文件中。 您可以随时更改参数,但由于稍后的touch
命令会利用该参数,所以最好使用-printf '"%t" "%p"\n'
。
find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files
尽可能修改你的文件
现在创build一个帮助你恢复时间戳的文件:
while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times
最后将旧的date应用到修改的文件
sh job.sh
警告:适用于具有名称间距,特殊字符的文件,但是例如没有带有$
符号的文件。
在Windows上只复制时间戳的最佳方法是:
要将任何文件上次创build/修改/访问的时间戳复制到另一个,您可以使用:
touch / c / m / a / r SourceFile DestFile
(此版本的Touch是Win32控制台工具箱http://www.stevemiller.net/apps/的一部分 )
Robocopy“SOURCE_DIRECTORY”“DESTINATION_DIRECTORY”/ E / COPYALL / DCOPY:DAT / XF 。 / R:10 / W:5 / V / ETA