如何使用cp -u
仅在内容不同时进行复制,执行以下操作时会失败
$ cd /tmp/exper ; cp -v ~/Downloads/C/test.c . ; sudo chmod -R 777 .
/home/budi/Downloads/C/test.c -> 'test.c'
$ cp -v -u test.c ~/Downloads/C
'test.c' -> '/home/budi/Downloads/C/test.c
因为内容是相同的,但是通过sudo chmod -R 777 .
如何正确地做到这一点?
答案1
cd /tmp/exper ; cp -v ~/Downloads/C/test.c .
cp -u
根本不检查内容!
它检查最后修改日期。仅当源文件 ( ~/Downloads/C/test.c
) 比目标文件 ( /tmp/exper/test.c
) 新时,才会进行复制。
(顺便说一句,您显示的命令与您粘贴的输出不匹配。而且不清楚它sudo chmod -R 777 .
在那里做什么。)
cp
但这里没有任何问题:打印的事实sourcefile -> targetfile
并不意味着该文件有被复制了,只是被复制了考虑复制。
答案2
正如 @MarcusMüller 所指出的,cp -u
检查文件修改日期,而不是内容,并且仅在源比目标新或目标不存在时进行复制。
'A' -> 'foobar/A'
当你这样做时你得到的事实\cp -uv A foobar/
表明副本确实发生了。这是 Debian 系列系统上的正常行为,我怀疑在大多数其他 Linux 版本上(尽管 BSD 和 OSX 的行为可能有所不同)。那么为什么会得到这个结果呢?
只是因为当您这样做时\cp -uv A foobar/
,新创建或复制的foobar/A
内容比A
.因此,当您决定进行反向复制操作时,即\cp -uv foobar/A .
复制会非常正常地进行。