对于cp命令,如何理解“较新”的文件

时间:2015-03-12 20:48:54

标签: linux cp

我检查了man cp并在Ubuntu 14.04中做了一些实验。我发现cp -u通过比较修改时间来更新文件。我对么?在手册页中指出:

  

-u, - 更新
  仅当SOURCE文件比目标文件更新或缺少目标文件时才复制

我无法找到" newer"的定义,我们是否比较一般情况下的访问时间,修改时间或更改时间?

2 个答案:

答案 0 :(得分:2)

当源发生元数据更改("更改")时,没有理由更新目标,例如重命名,附加硬链接等等。因此可以预期只有内容发生变化("修改")才算数。

我刚刚通过创建源文件,复制到目标,重命名源并重复复制来测试它。

根据上次元数据更改列出文件ls -ltc时,源文件的时间戳更新。所以没有复制,尽管来源是更新的"更改"。内容的变化会导致目标的预期更新。

简单说明:重命名会更改修改时间,实际上并不是很明显,因为文件名存储在目录中,而不是存储在inode中。但是,当重命名内核时,会创建有问题的inode的新硬链接,并删除指向旧名称的链接。因此,虽然inode中存储的硬链接数在重命名操作之前和之后是相同的,但inode实际上已经改变了两次。

对于像chmod这样对inode的影响更明显的更改,可以实现相同的结果。

答案 1 :(得分:0)

我检查了 core-utils source files --update选项,现在我可以回答一次。当您对-u命令使用--updatecp选项时,它将在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);

肯定是修改时间。你是对的! :)