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

Ope*_*way 51 cp

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

我用

cp -r /origin /destination

有时,由于链接、权限等原因,我会遇到一些错误。所以我修复了错误,并需要重新开始复制​​。

我想知道如何告诉命令“cp”,一旦它尝试再次复制,如果目标文件夹中存在文件,则不要再次复制它们。

Bal*_*our 127

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

手册页

-n, --no-clobber

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

  • 这是这个问题的唯一正确答案。 (12认同)

use*_*894 34

cp -R -u -p /source /destination

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

从 cp 的手册页:

-u, --update

仅当 SOURCE 文件比目标文件新或目标文件丢失时才复制

  • 要从字面上只复制不存在的文件而不更新现有的文件,`yes n | cp -i /source/* /destination 2&gt;/dev/null` (10认同)
  • -u, --update 仅当 SOURCE 文件比目标文件新或目标文件丢失时才复制 -u, --update 仅当 SOURCE 文件比目标文件新或目标文件丢失时复制-p 与 --preserve=mode,ownership,timestamps 相同 --preserve[=ATTR_LIST] 保留指定的属性(默认:mode,ownership,timestamps),如果可能的话附加属性:context, links, xattr, all (5认同)
  • 我的 Mac 上没有“-u”选项。我认为可以使用 `-n` 选项,这意味着根据手册页“不要覆盖现有文件”。我看到这是在另一个答案中。令人不安的是,不同的系统在像“cp”这样的基本问题上并不一致。 (2认同)

Mar*_*ett 23

rsync -aq /src /dest

除了只复制较新的文件外,它甚至只会在文件发生更改时复制文件的较新部分。它旨在通过网络链接复制您想要最小化数据量的地方 - 但它在本地也能很好地工作。


Kam*_*ski 6

POSIX解决方案

其他答案使用-u-n选项cp. POSIX 不需要这些;也不是rsync来自另一个答案;也没有yes在评论之一中使用。

尽管如此,我们仍然可以yes nwhile循环来重现。这导致了以下 POSIX 解决方案:

while true; do echo n; done | cp -Ri /origin /destination 2>/dev/null
Run Code Online (Sandbox Code Playgroud)


Poi*_*nty 5

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

  • 不同意使用 -u 是个好主意。-u 仅当源较新或目标丢失时才复制。原始发帖者的问题是由于某种原因导致文件副本损坏造成的。因此,OP 将具有半写入的文件,在重新运行副本时不会更新该文件。该文件可能对某人很重要!**rsync解决了这个问题。** (3认同)

小智 5

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

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

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

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