我检查了man cp
并在Ubuntu 14.04中做了一些实验。我发现cp -u
通过比较修改时间来更新文件。我对么?在手册页中指出:
-u, - 更新
仅当SOURCE文件比目标文件更新或缺少目标文件时才复制
我无法找到" newer"的定义,我们是否比较一般情况下的访问时间,修改时间或更改时间?
答案 0 :(得分:2)
当源发生元数据更改("更改")时,没有理由更新目标,例如重命名,附加硬链接等等。因此可以预期只有内容发生变化("修改")才算数。
我刚刚通过创建源文件,复制到目标,重命名源并重复复制来测试它。
根据上次元数据更改列出文件ls -ltc
时,源文件的时间戳更新。所以没有复制,尽管来源是更新的"更改"。内容的变化会导致目标的预期更新。
简单说明:重命名会更改修改时间,实际上并不是很明显,因为文件名存储在目录中,而不是存储在inode中。但是,当重命名内核时,会创建有问题的inode的新硬链接,并删除指向旧名称的链接。因此,虽然inode中存储的硬链接数在重命名操作之前和之后是相同的,但inode实际上已经改变了两次。
对于像chmod
这样对inode的影响更明显的更改,可以实现相同的结果。
答案 1 :(得分:0)
我检查了 core-utils source files --update
选项,现在我可以回答一次。当您对-u
命令使用--update
或cp
选项时,它将在1662行的copy.c中使用:
if (0 <= utimecmp (dst_name, &dst_sb, &src_sb, options))
正如您所看到的,它正在使用附加功能,即比较文件信息。现在我们只需要utimecmp
如何工作。它的代码可用here,这就是比较:
time_t dst_s = dst_stat->st_mtime;
time_t src_s = src_stat->st_mtime;
int dst_ns = get_stat_mtime_ns (dst_stat);
int src_ns = get_stat_mtime_ns (src_stat);
肯定是修改时间。你是对的! :)