如何复制保留所有者和权限的文件夹?


376

因此,我要备份主文件夹,方法是将其复制到外部驱动器,如下所示:

sudo cp -r /home/my_home /media/backup/my_home

结果,外部驱动器上的所有文件夹现在都归root:root。我如何cp保留原始文件的所有权和权限?


23
是的,很高兴他问,因为google仍然比'man':-)快。
Stijn Geukens

3
我很高兴他也提出了要求
Ole 2016年

5
@StijnGeukens甚至不是Google更快,甚至man对我来说都是神秘的。在这种情况下,manat -rsame as --preserve=mode,ownership,timestamps。我应该怎么知道这意味着要保留原始权限!?
Kolob Canyon'Nov 15'16

@KolobCanyon您的意思是-p
风暴

Answers:


452
sudo cp -rp /home/my_home /media/backup/my_home

从cp联机帮助页:

 -p     same as --preserve=mode,ownership,timestamps

 --preserve[=ATTR_LIST]
          preserve the specified attributes (default: mode,ownership,timestamps),
          if possible additional attributes: context, links, xattr, all

128
更好用cp -a。这还包括-r递归标志,但它做的还不止如此-它保留了有关文件的所有内容;SELinux属性,链接,xattr等所有内容。这是“存档模式”。有更好的备份工具,但是如果要使用cp备份,请不要使用cp -a
2015年

24
可以,但是耐心在这里很好。该命令仅在完成时才正确设置所有内容:虽然它仍在复制目录,并且您以root身份运行cp,但该目录将归root所有。只有在完成此目录后,才会将其设置为正确的权限。
Paul

4
cp -a在某些系统上不起作用:例如OS X,其中(至少在某些版本中)需要使用cp -pR。在我当前的OS X系统上(10.10.15),cp -a似乎很荣幸。
dubiousjim

如果我使用cp -a复制文件夹结构,则使用diff <(getfacl -R folder1) <(getfacl -R folder2)sill似乎会获得不同的访问控制列表:(
philx_x

为什么对“ cp -rp”而不是“ cp -p”正确?
Eugene Kaurov

94

您也可以使用rsync

sudo rsync -a /home/my_home/ /media/backup/my_home/

rsync联机帮助页:

 -a, --archive
              This  is  equivalent  to  -rlptgoD.  It  is a quick way of saying you want
              recursion and want to preserve almost everything (with -H being a  notable
              omission).    The   only  exception  to  the  above  equivalence  is  when
              --files-from is specified, in which case -r is not implied.

              Note that -a does not preserve hardlinks, because finding  multiply-linked
              files is expensive.  You must separately specify -H.

看到这个问题的之间的比较cprsynchttps://stackoverflow.com/q/6339287/406686

注意尾部的斜杠(有关详细信息,请参见手册页)。


4
+1 cp -p很好,但rsync总体而言,我更喜欢的输出,因此我已经别名pcptime rsync --progress -ah。在我心中代表“进度复制”。而且两者都接受-r,因此对于一般的终端使用来说效果很好-但不幸的是,不能与sudo该问题/答案所示的结合使用。
伊兹卡塔2012年

15
注意:rsync -a不会保留扩展属性(-X)和ACL(-A)-简短说明说archive mode; equals -rlptgoD (no -H,-A,-X)。例如,如果没有SELinux上下文,将不会保留-X。在许多用例中,这很好,但是如果您对系统分区进行备份,则丢失-X可能会造成很大的损失。据我所知,cp -a实际上保留了所有文件属性。
英仙座

2
刚刚对此进行了测试,在sudo cp -a保留所有权和组的同时将其sudo rsync -a更改为root。因此,@ Perseids是正确的。
约翰·汉密尔顿

3
@JohnHamilton在Mint上,这非常好用……它只会在以后更改所有权和组(我不知道何时)。我刚刚复制了我的整个/home文件夹,rsync -aX /home /mnt/sdd/它就像一个魅力。
奥利维尔·庞斯

@JohnHamilton根本不是Perseides所说的。
user643011

60
cp -a

哪里-a的缩写--archive-基本上,它完全照原样复制目录;文件保留其所有属性,并且符号链接未取消引用(-d)。

来自man cp

   -a, --archive
          same as -dR --preserve=all

21

我使用cp -pdRx它将-p保留模式,所有权和时间戳,-d保留链接(这样就得到符号链接而不是复制的文件内容),-R递归执行并-x保留在一个文件系统上(仅在复制/或具有活动挂载点的情况下才有用))。

PS:-R代替的-r是仅使用习惯ls -lR


2
cp -ax是同一件事的简短版本。效果很好-谢谢!
EM0

-r和之间实际上是有区别的-R。检查手册页(即使特定部分的时间太长,也无法在此处引用)。
geckon

2
我不认为有(尽管曾经有过并且可能仍然存在于某些版本的Unix上)。参见man7.org/linux/man-pages/man1/cp.1.html简而言之-R, -r, --recursive copy directories recursively
StarNamer

14

cp可以选择保留文件所有权。在以下页面的手册中cp

-p    Cause cp to preserve the following attributes of each source file in the copy: modification
      time, access time, file flags, file mode, user ID, and group ID, as allowed by permissions.
      Access Control Lists (ACLs) and Extended Attributes (EAs), including resource forks, will also
      be preserved.

11

您可以执行以下操作:

tar cf - my_home | (cd /media/backup; sudo tar xf - )

tar保持权限,所有权和目录结构完整,但将所有内容转换为字节流。您运行一个“ subshel​​l”(带括号的命令)来更改目录,然后tar反转转换。一堆字节变成具有正确所有权和权限的目录和文件。


7

答案很简单:cp有一个-p保留权限的选项(这是一条鱼)。

但是正如Wojtek在他的评论中所说,man cp(阅读精美的手册)将是一个很好的起点(想学习如何钓鱼?)。


1

您可以使用preserve = all,然后您的副本将保留所有属性,例如文件的所有者,组和时间戳。因此,请使用以下命令安全地进行备份。

cp -r --preserve=all /home/my_home /media/backup/my_home
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.