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

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

-u,–update
仅在SOURCE文件比目标文件新或目标文件丢失时才复制

我找不到“新”的定义,一般情况下比较访问时间,修改时间还是更改时间?

当元数据发生变化(“变化”)时,没有理由更新目标,例如重命名,额外的硬链接或其他。 所以可以预料的是只有内容变化(“修改”)才算数。

我只是通过创建一个源文件,复制到目标,重命名源文件和重复复制来测试。

当根据ls -ltc的最后一次元数据更改ls -ltc文件时,源文件的时间戳更新。 所以尽管源代码更新有关“更改”,但没有复制。 内容的变化导致目标的预期更新。

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

如果对inode的影响比chmod更明显,那么可以实现相同的结果。

我检查了核心实用程序 源文件的更新选项,现在我可以回答一次。 当你使用-u--update选项到你的cp命令时 – 它在1662行的copy.c中使用:

 if (0 <= utimecmp (dst_name, &dst_sb, &src_sb, options)) 

正如你可以看到它使用额外的功能,这是比较文件信息。 现在我们只需要现在utimecmp如何工作。 这里的代码是可用的,那就是比较:

 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); 

当然是修改时间 。 你是对的! 🙂