在Linux中复制文件,如果目标中确实存在文件,则避免复制


32

我需要将/ home / user文件夹从一个硬盘复制到另一个硬盘。它有100,000个文件,大小约为10G。

我用

cp -r /origin /destination

有时由于链接断开,权限等问题,我会遇到一些错误。因此,我修复了该错误,并需要重新开始复制​​。

我不知道如何告诉命令“ cp”,一旦它试图再次复制,而不是如果目标文件夹中存在文件,就不会再次复制。


2
我们不要cp。请改用rsync。
William Pursell 2010年

Answers:


22

cp -R -u -p /source /destination

-u--update)标志不只是这一点:

在cp的手册页中:

-u,-更新

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


6
要从字面上仅复制不存在的文件而不更新现有文件, yes n | cp -i /source/* /destination 2>/dev/null
sventechie

4
-u仅在源文件比目标文件新或缺少目标文件时更新副本-u仅在源文件比目标文件新或缺少目标文件时更新副本-p与--preserve = mode,ownership,timestamps --preserve [= ATTR_LIST]一样,保留指定的属性(默认值:mode,ownership,timestamps),如果可能的话,还包括其他属性:上下文,链接,xattr,全部
Covich

51

只需使用cp -n <source> <dest>

手册页

-n,-无弹性

不要覆盖现有文件(覆盖先前的-i选项)


7
这是对该问题的唯一真实答案。
sebix

20

rsync -aq /src /dest

除了仅复制较新的文件外,如果文件已更改,它甚至仅复制文件的较新部分。它旨在通过网络链接进行复制,以在其中减少数据量,但是在本地也很有效。


我不能在您的帖子中添加``''格式,因为它只有两个字符。您如何编辑此命令并在命令周围添加``字符?
culix

4

查找cp命令的“ -u”选项。


2
不同意使用-u是一个好主意。-u仅在源较新或目标丢失时才复制。原始海报的问题是由于任何原因导致文件复制中断。因此,OP将具有半写入的文件,该文件在重新运行副本时不会更新。该文件对某人可能很重要!rsync解决了这个问题。
hazymat

2

以上所有答案都是正确的,但是如果您递归执行此操作,则

你应该做:

 cp -rn SOURCE_PATH DESTINATION_PATH

1

您应该以root用户身份进行复制以维护权限/所有权

# cp -au

也看看rsync


1

POSIX解决方案

其他答案使用-u-n选项cpPOSIX都不需要这些;也不是rsync另一个答案;也未yes在评论之一中使用。

然而,我们可以重现yes n一个while循环。这将导致以下POSIX解决方案:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null

0

使用 cp -rn <sourcedirname>/. <destdirname>

r开关使副本在目录上递归。

n开关(长版本no-clobber)确保现有文件永远不会被覆盖。

/.sourcedirname之后的' '确保它不会成为destdirname下的子目录,而不是将前者的所有内容复制到后者。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.