如何复制文件夹以保持所有者和权限不变?

Psa*_*nia 478 permissions cp

所以我打算通过将它复制到外部驱动器来备份我的主文件夹,如下所示:

sudo cp -r /home/my_home /media/backup/my_home
Run Code Online (Sandbox Code Playgroud)

结果,外部驱动器上的所有文件夹现在都归root:root. 我怎样才能cp保留原始的所有权和权限?

gui*_*ido 587

sudo cp -rp /home/my_home /media/backup/my_home
Run Code Online (Sandbox Code Playgroud)

从 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
Run Code Online (Sandbox Code Playgroud)

  • 最好使用`cp -a`。这也包括 `-r`ecursive 标志,但它的作用不止于此——它保留了有关文件的所有内容;SELinux 属性、链接、xattr,应有尽有。这是“存档模式”。有更好的备份工具,但是*如果*你使用`cp`进行备份,不要使用`cp -a`以外的任何东西。 (178认同)
  • 它有效,但耐心在这里很好。该命令只会在完成时将所有内容设置正确:当它仍在复制目录时,并且您以 root 身份运行 cp 时,该目录将由 root 拥有。它只会在完成此目录后将其设置为正确的权限。 (32认同)
  • `cp -a` 在某些系统上不起作用:例如 OS X,其中(至少在某些版本中)需要使用 `cp -pR`。虽然在我当前的 OS X 系统 (10.10.15) 上,`cp -a` 似乎很受尊重。 (6认同)
  • 如果我使用 cp -a 复制文件夹结构,然后使用 `diff <(getfacl -Rfolder1) <(getfacl -Rfolder2)` 我似乎仍然得到不同的访问控制列表:( (2认同)
  • @EugeneKaurov -r 是递归的。没有它你就无法复制目录。 (2认同)

stu*_*ent 112

您也可以使用rsync.

sudo rsync -a /home/my_home/ /media/backup/my_home/
Run Code Online (Sandbox Code Playgroud)

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.
Run Code Online (Sandbox Code Playgroud)

请参阅此问题以了解cp和之间的比较rsynchttps : //stackoverflow.com/q/6339287/406686

请注意尾部斜杠(有关详细信息,请参见联机帮助页)。

  • 注意:`rsync -a`,不保留扩展属性(`-X`),也没有 ACL(`-A`)——简短的描述是“归档模式”;等于 -rlptgoD(无 -H、-A、-X)`。例如,没有`-X` 就不会保留SELinux 上下文。对于许多用例,这很好,但是如果您备份系统分区,缺少 -X 可能会破坏很多。据我所知,`cp -a` 确实保留了所有文件属性。 (20认同)
  • +1,`cp -p` 很好,但我更喜欢`rsync` 的输出,所以我将`pcp` 别名为`time rsync --progress -ah`。在我心中代表“进度复制”。并且两者都接受`-r`,因此它适用于一般终端使用 - 但不幸的是,不能与此问题/答案中所示的`sudo`结合使用。 (4认同)
  • 刚刚对此进行了测试,而 `sudo cp -a` 保留所有权和组,而 `sudo rsync -a` 将它们更改为 root。所以,@Perseids 是正确的。 (3认同)
  • @JohnHamilton Under Mint,这非常有效......它只会在以后更改所有权和组(我不知道什么时候)。我刚刚用 `rsync -aX /home /mnt/sdd/` 复制了我的整个 `/home` 文件夹,它就像一个魅力。 (3认同)
  • @JohnHamilton 这根本不是珀尔塞德斯所说的。 (2认同)

Zaz*_*Zaz 78

cp -a
Run Code Online (Sandbox Code Playgroud)

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

来自man cp

   -a, --archive
          same as -dR --preserve=all
Run Code Online (Sandbox Code Playgroud)

  • 哪个不保留ᴀᴄʟs。 (2认同)

Sta*_*mer 24

我使用cp -pdRxwhich 将-p保留模式、所有权和时间戳,-d保留链接(因此您得到符号链接而不是复制的文件内容),-R递归执行并-x保留在一个文件系统上(仅当您正在复制/或具有活动挂载点的东西时才真正有用)。

PS:-R而不是-r只是习惯使用ls -lR.

  • 我认为没有(尽管在某些版本的 Unix 上可能曾经有过并且可能仍然存在)。参见 http://man7.org/linux/man-pages/man1/cp.1.html 它只是简单地说`-R, -r, --recursive copy directory recursively`。 (5认同)
  • `cp -ax` 是同一事物的略短版本。这很好用 - 谢谢! (3认同)

Mat*_*teo 15

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.
Run Code Online (Sandbox Code Playgroud)


Bru*_*ger 13

你可以这样做:

tar cf - my_home | (cd /media/backup; sudo tar xf - )
Run Code Online (Sandbox Code Playgroud)

tar保持权限、所有权和目录结构不变,但将所有内容转换为字节流。您运行一个更改目录的“子shell”(带括号的命令),然后开始tar反转转换。字节流变成具有正确所有权和权限的目录和文件。


小智 10

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

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