使用cp命令在命令行复制目录时出错

4

Mac OS X Yosemite v.10.10.5.

我正在尝试使用cp命令将一个Git目录复制到另一个目录。

cp -r /path/to/dir/from/ /path/to/dir/to/

cp: /path/to/dir/to/.git/objects/00/00ad2afeb304e18870d4509efc89fedcb3f128: Permission denied

这个错误会针对目录中的每个文件返回一次(我相信但没有验证)。
第一次运行命令时,它按预期正常工作,没有错误。但是,在没有更改任何文件的情况下,第二次(以及后续)运行命令时,就会出现错误。
发生了什么?我该如何解决?
编辑:
回答评论中的问题: ls -l /path/to/dir/to/.git/objects/00/00ad2afeb304e18870d4509efc89fedcb3f128 显示什么?
-r--r--r-- 1 myusername staff 6151 May 6 00:45 /path/to/dir/to/.git/objects/00/00ad2afeb304e18870d4509efc89fedcb3f128

@anubhava:-r--r--r-- 1 myusername staff 6151 May 6 00:45 /path/to/dir/to/.git/objects/00/00ad2afeb304e18870d4509efc89fedcb3f128 - Let Me Tink About It
1
正如您所看到的,该文件仅具有读取权限,因此“cp”操作失败,因为它还需要写入权限。 - anubhava
@anubhava:两个问题。1. 我怎么添加写入权限?2. 为什么我第一次尝试使用 cp 命令时它可以工作? - Let Me Tink About It
您可以使用chmod命令。 - Carl Tashian
@CarlTashian:你能给我一个快速的例子吗?如果在下面的答案中有,我会倾向于接受它。 - Let Me Tink About It
1
@Mowzer:权限并不是主要问题。如果你想每次运行命令时都完全清除目标目录中的所有内容并覆盖,则根本不需要使用chmod,而是在复制之前删除目标目录(如果存在)。 - l'L'l
2个回答

4
您之所以会收到“权限被拒绝”的提示,是因为您试图覆盖一个已经存在于目标目录中的只读文件。既然您似乎想要覆盖它,那么在复制操作之前可以尝试删除目标目录(如果存在)。此外,您应该使用 -R 而不是 -r

历史版本的 cp 实用程序有一个 -r 选项。本实现支持该选项;但是,强烈不建议使用,因为它不能正确地复制特殊文件、符号链接或 fifo。

使用以下命令可以解决您的问题:

[[ ! -d dest ]] || rm -rf dest ; cp -R src dest

以上代码检查是否存在dest,如果存在,则递归删除它,然后将source复制到dest

1
你可能需要使用cp -rp进行此操作。-p会保留与文件相关联的用户和组ID。尝试使用-p重新开始,看看是否解决了问题。
另一个可能导致此问题的原因是权限确实被拒绝。也就是说,如果你试图将文件复制到由另一个用户拥有但没有超级用户权限的文件夹中。

谢谢,但这个答案不起作用。我尝试了cp -rpcp -r -p两种方法。 - Let Me Tink About It
1
cp -f可能更相关(尽管-p也不是一个坏主意)。 - Jonathan Leffler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接