目前我有两个目录 A/ 和 B/,除了时间戳外,它们在各方面都相同。因此,如果我运行以下命令:
rsync --dry-run -crvv A/ B/
然后所有文件都标记为“uptodate”,而命令:
rsync --dry-run -rvv A/ B/
表示所有文件都将从 A/ 复制到 B/。
我的问题是:假设我知道这些文件是相同的(就内容而言),那么是否有任何方法(通过 rsync 或其他方式)将 B/ 中文件的时间戳设置为与 A/ 中文件的时间戳相同,而无需将所有文件从 A/ 复制到 B/?
谢谢
答案1
使用-t
(保留时间戳)和--size-only
将仅比较文件的大小。如果大小匹配,rsync 将不会复制该文件,但由于-t
指定了,它将更新目标文件的时间戳而不重新复制它。
确保不要使用-u
(更新),因为这将跳过已经存在的文件并完全跳过更新时间戳。
我最初遇到的问题是由于没有使用 rsync 将一堆文件复制到新驱动器,因此时间戳被更新为当前时间。我使用以下命令在相当长的时间内正确同步所有内容:
rsync -vrt --size-only /src /dest
答案2
如果大小匹配,使用 --size-only 将导致 rsync 跳过比较文件时间戳(以及文件内容)。将其与 --times 结合使用将把时间戳克隆到目标树。
答案3
使用来源(例如/path/to/source
)目录作为 touch 命令的参考。cd
目标目录并执行
find -type f -exec touch -r /path/to/source/{} {} \;
您还不能使用 rsync 复制亚秒级时间戳。
这也适用于目录和伪文件(只需删除或更改-type f
)
答案4
嗯,你当然可以编写一个脚本,从一侧读取时间戳,然后使用触摸将其设置在另一侧的同一个文件上。
但这可能比简单地让 rsync 尝试复制所有文件花费的时间更长。实际上传输的数据非常少(如果文件确实相同,则仅传输块哈希)。但至少必须在每一侧读取每个文件的完整内容。因此,如果您受到磁盘带宽或 IOPS 的限制,则可能需要一段时间。但可能仍然比编写和测试脚本来执行此操作要少。