复制文件或者目录时如何保留所有权和文件权限

时间:2020-03-21 11:44:42  来源:igfitidea点击:

另一天,我计划将一些数据从Ubuntu桌面系统备份到外部U盘。
将所有数据转移到外部驱动器后,我注意到源和目标文件和目录的所有者和权限都不同。
但是,我希望在两个位置保持现有的文件属性(例如所有者,组和时间戳等)。
在快速谷歌搜索并通过"CP"命令的人的页面之后,我发现我们可以在复制Linux上复制文件和目录时保持所有权和文件权限。
如果你曾经在这样的情况下,这里是一个快速解决方法来做到这一点。

在将文件或者Linux上的文件或者目录复制时,请保留所有权和文件权限

CP命令可以选项复制文件和目录,但保留从原始文件中保留修改时间,访问时间和模式。

$cp -rp ~/data /media/sk/sk_seagate/data/

其中我正在将名为"data"的文件夹的内容复制到我的外部驱动器。

来自CP命令的man 页面:

-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

因此,如果使用-p标志,它将保留所有现有的文件属性,例如从原始文件中的模式,所有权和时间戳。

此处使用"-R"标志以递归复制目录。
意味着它将复制目录及其子目录和文件。

或者,我们可以使用-a标志。
它包括-R标志并保留所有内容,例如链接,XATTR,SELinux属性等。

$cp -a ~/data /media/sk/sk_seagate/data/

来自CP命令的man 页面:

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

要验证文件权限和所有权是否已完整,请在两个位置上使用getfacl命令:源和目标。

$getfacl ~/data
$getfacl /media/sk/sk_seagate/data/

如果要在同一网络中从本地系统之间复制文件到远程系统,则可以使用"SCP"命令将文件从一个系统传输到另一个系统中的另一个系统。

$scp -rp ~/data Hyman@theitroad:/home/senthil/

上面的命令将将名为"data"的内容文件夹从我本地系统复制到远程系统。
其中192168.225.22是我远程系统的IP地址,"senthil"是远程系统的用户名。

使用"getfacl"命令检查两个系统上的"数据"目录的文件权限和所有权。

首先让允许检查本地系统上的"数据"目录的文件属性:

$getfacl data/

示例输出:

# file: data/
# owner: sk
# group: sk
user::rwx
group::rwx
other::r-x

接下来,检查远程系统上的"Data"目录的文件属性。
我们可以直接登录远程系统,并通过下面的SSH命令检查远程目录的FIE属性。

$ssh Hyman@theitroad getfacl data

示例输出:

Hyman@theitroad's password:
# file: data
# owner: senthil
# group: senthil
user::rwx
group::rwx
other::r-x

由于我们可能在上面的输出中注意到,我的远程系统中的所有者和组信息(即senthil)不同。
因此,SCP命令的-P标志不保留所有权限。

来自SCP命令的人网页:

-p      Preserves modification times, access times, and modes from the original file.

很明显,-p标志只能保留原始文件的修改时间,访问时间和模式,而不是所有权。
在这种情况下,我们可以在两个系统上创建常见的用户名,然后尝试上面的命令携带不同系统的相同所有权和文件权限。
或者只需使用目标系统上的"chown"命令来更改所有权。

有关更多详细信息,请参阅CP和SCP命令的Man页面。

$man cp
$man scp