如何复制文件并将其授权给目标目录

14

我正在将文件从源位置复制到目标位置。源位置不是我的拥有者,文件的权限为----rwx---。被复制到由我拥有的目录中的文件权限为----r-x---。目标目录的权限为drwxrwsrwx。如何让复制后的文件与目标目录具有相同的权限?我尝试了“cp --no-preserve=all”,但它没有起作用(权限仍然相同)。

2个回答

12

试试这个:

cp --no-preserve=mode,ownership $backupfile $destination

5
这并不会设置新复制的文件在目标目录中的权限。相反,它会设置在复制操作下执行的用户的权限。例如,如果您使用root进行复制,则复制的文件权限将为“root:root”。 - o.v

5

让我重新表达一下:"如何在复制时保留目标目录的权限?"
我不能为答案负责,因为我只是结合了几个我在网络上找到的答案。所以接下来就是答案。

首先

通常情况下,文件被复制到的目录不会传播其权限,而是新权限由用户的umask控制。但是,当你将文件从一个位置复制到另一个位置时,它是一个特殊情况,用户的umask基本上被忽略,文件上的现有权限被保留。

这就解释了为什么你不能直接传播src的权限到dst目录。

然而,有两步解决方法。

  1. cp-metadata:将你想要保留的属性(仅限属性)复制回源目录。这里有一个可以完成此操作的快速脚本:
#!/bin/bash
# Filename: cp-metadata

myecho=echo 
src_path="$1"  
dst_path="$2"

find "$src_path" |
  while read src_file; do
    dst_file="$dst_path${src_file#$src_path}"
    $myecho chmod --reference="$src_file" "$dst_file"
    $myecho chown --reference="$src_file" "$dst_file"
    $myecho touch --reference="$src_file" "$dst_file"
  done

如果您不想保留时间戳,可以省略touch命令。 将myecho=echo替换为myecho=以执行命令。
请注意,此脚本应在sudo模式下运行,以便能够有效地运行chownchmod
  1. cp --preserve: 成功运行第一个命令后, 现在是时候将内容与属性一起复制到dst目录中了。

    --preserve[=ATTR_LIST]
    保留指定的属性(默认值:模式、所有者、时间戳),如果可能还有其他属性:上下文、链接、xattr、全部

    \cp -rfp $src_dir $dst_dir应该做你想要的事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接