如何复制文件并授予它们目标目录的权限

Nas*_*din 9 linux deployment permissions cp

我正在将文件从源复制到位置.源不属于我,源文件的权限是---- rwx ---.处理我所拥有的目标目录的文件的权限是---- rx ---.目标目录的权限是drwxrwsrwx.如何使用目标目录具有相同权限的文件.我试过"cp --no-preserve = all"但它没有用(仍然是相同的权限).

Gio*_*ano 13

试试这个:

cp --no-preserve=mode,ownership $backupfile $destination
Run Code Online (Sandbox Code Playgroud)

  • 这_不_设置目标目录对新复制文件的权限。相反,它会设置执行复制操作的用户的权限。例如,如果您在 root 下复制,复制的文件权限将为 `root:root`。 (2认同)

lae*_*tis 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
Run Code Online (Sandbox Code Playgroud)

touch如果您不想保留时间戳,可以省略该命令。替换myecho=echomyecho=实际执行命令。
请注意,此脚本应该在sudo模式下运行,以便能够有效地chown运行chmod

  1. cp --preserve:成功运行第一个命令后,现在可以将内容和属性复制到 dst 目录。

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

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