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

Error copying directories at command line using cp

Mac OS X Yosemite v.10.10.5.

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

这个命令行语句:
cp -r /path/to/dir/from/ /path/to/dir/to/
Returns 这个错误:
cp: /path/to/dir/to/.git/objects/00/00ad2afeb304e18870d4509efc89fedcb3f128: Permission denied

对于目录中的每个文件(我相信,但尚未验证,是),每次都会返回一次此错误。

我第一次 运行 命令正常工作,正如预期的那样,没有错误。但是,在没有对任何文件进行任何更改的情况下,第二次(及后续)我 运行 命令,我得到了错误。

这是怎么回事?我该如何解决这个问题?

编辑:

回复评论中的一个问题:

What does ls -l /path/to/dir/to/.git/objects/00/00ad2afeb304e18870d4509efc89fedcb3f128 show?

答案是:

-r--r--r-- 1 myusername staff 6151 May 6 00:45 /path/to/dir/to/.git/objects/00/00ad2afeb304e18870d4509efc89fedcb3f128

您可能需要 cp -rp 进行此操作。 -p 保留与文件关联的用户和组 ID。尝试使用 -p 重新开始,看看是否能解决问题。

您可能会看到此问题的另一个原因是权限是否确实被拒绝。也就是说,如果您试图复制到另一个没有超级用户权限的用户所拥有的文件夹中。

您得到 Permission Denied 的原因是因为您正试图覆盖目标目录中已存在且设置了只读权限的文件。由于您似乎正在尝试覆盖它,因此您可以删除目标目录(如果它在复制操作之前存在)。您还应该使用 -R,而不是 -r ...

Historic versions of the cp utility had a -r option. This implementation supports that option; however, its use is strongly discouraged, as it does not correctly copy special files, symbolic links, or fifo's.

使用这样的命令应该可以解决您的问题:

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

上面检查 dest 是否存在;如果确实递归删除它,则将 source 复制到 dest