Linux 对于cp命令,如何理解;更新的;文件

Linux 对于cp命令,如何理解;更新的;文件,linux,cp,Linux,Cp,我检查了mancp,并在Ubuntu 14.04中做了一些实验。我发现cp-u通过比较修改时间来更新文件。我说得对吗?手册页中指出: -u,--update 仅当源文件比目标文件新或目标文件丢失时复制 我就是找不到“更新”的定义,我们是比较一般情况下的访问时间、修改时间还是更改时间 当源发生元数据更改(“更改”)时(如重命名、附加硬链接或其他任何更改),没有理由更新目标。因此,预计只有内容更改(“修改”)才算数 我只是通过创建一个源文件、复制到目标文件、重命名源文件并重复复制来测试这一点 使用l

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

-u,--update
仅当源文件比目标文件新或目标文件丢失时复制


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

当源发生元数据更改(“更改”)时(如重命名、附加硬链接或其他任何更改),没有理由更新目标。因此,预计只有内容更改(“修改”)才算数

我只是通过创建一个源文件、复制到目标文件、重命名源文件并重复复制来测试这一点

使用
ls-ltc
根据上次元数据更改列出文件时,源文件的时间戳较新。因此,尽管源代码较新,但在“更改”方面没有复制。内容的更改导致目标的预期更新

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


同样的结果也可以通过对inode的影响更明显的更改来实现,比如
chmod

我选中了
--update
选项的核心utils,现在我可以一劳永逸地回答它了。当您对
cp
命令使用
-u
-update
选项时,会在第1662行的copy.c中使用该选项:

if (0 <= utimecmp (dst_name, &dst_sb, &src_sb, options))
当然是修改时间了。你是对的!:)

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