我想递归复制一个目录,保留文件属性,其中包含一个目录树,其中包括一些权限为 200 (即--w-------
)的文件。
复制命令cp -ar sourcedirectory targetdirectory
会跳过这些文件,对于每个文件,如下所示:
cp: cannot open `sourcedirectory/foo/somefile.bar' for reading: Permission denied`
我的问题:在不更改权限的情况下,如何防止复制命令跳过这些文件?
如果您认为我应该使用cp
复制命令以外的实用程序,请解释原因。
答案1
您必须使文件可读才能复制它。这与工具的选择无关:每个程序都将无法打开该文件进行读取,因为您没有读取该文件的权限。
如果ACL已启用(对于 ext2/ext3/ext4,这需要 mount 选项acl
)并且您对复制它们不感兴趣,请添加一个 ACL,允许执行复制的用户读取文件。
setfacl -R -m u:username:rX sourcedirectory
否则,您必须事先更改文件权限并随后恢复它们(双方),或者以 root 身份进行复制。
答案2
这一页提供了多种复制数据的方法,保留尽可能多的元数据。你可以尝试每一个,作为根用户:
cp -av /source /dest
# 不要使用-r
,它的行为很难预测并且-a
已经包含-R
cd /source; tar -cf- . | tar -xvpf- -C /dest
cd /source; find . -depth -print0 | cpio -pdmv -0 /dest
rsync -av --delete --hard-links /source/ /dest
/
Rsync 对于参数中的尾随 s 有点棘手。正如其手册页中所解释的,这两种方法都是将目录复制/source/foo
到/dest/foo
:
rsync ... /source/foo /dest
rsync ... /source/foo/ /dest/foo
这些可能都不起作用。确保在尝试它们的同时寻找最好的前景。
答案3
据我所知,我们可以按照以下步骤保持权限不变并复制所有文件。
$ cd <sourcedirectory>
$ tar -cvf <sourcedirectory.tar> .
$ cp <sourcedirectory.tar> <destinationdirectory>
$ tar -xvf <sourcedirectory.tar>