从另一个文件克隆所有权和权限?

use*_*394 140 shell permissions files chown

是否有命令或标志可以从另一个文件克隆文件的用户/组所有权和权限?使权限和所有权与另一个文件完全相同?

enz*_*tib 199

在GNU / Linuxchownchmod有一个--reference选项

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 13

在任何带有 GNU 实用程序的 unix 上,例如(非嵌入式)Linux 或 Cygwin,您都可以使用chmod --referencechown --reference

如果您的系统有ACL,请尝试使用 ACL 命令getfaclsetfacl。这些命令因系统而异,但在许多系统中您可以getfacl other_file | setfacl -bnM - file_to_change用来复制权限。这不会复制所有权;您可以通过仔细解析 来做到这一点ls -l other_file,假设您没有包含空格的用户名或组名。

LC_ALL=C ls -l other_file | {
  read -r permissions links user group stuff;
  chown -- "$user:$group" file_to_change
}
getfacl other_file | setfacl -bnM - file_to_change
Run Code Online (Sandbox Code Playgroud)

  • @enzotib 至少在 Linux 上,即使源文件系统和目标文件系统不支持 ACL,ACL 工具也可以复制权限(但不是所有权)。 (2认同)

mjl*_*ano 9

根据Matteo的响应做了一个bash 命令:)

代码:

chmod $( stat -f '%p' "$1" ) "${@:2}"

用法:

cp-permissions <from> <to>...

  • 哎呀!你从哪里学会说`${*:2}`?永远不要再这样做了!如果任何文件名包含空格(或制表符),这将失败。使用`"${@:2}"`。另外,使用`"$1"` 而不是`$1`。 (6认同)

Mat*_*teo 5

如果您没有使用带有 GNU 的 chmod/chown(支持该--reference选项)的系统,您可以尝试解析ls -l

这里有一个小脚本chmod(如果你知道哪些支持扩展的正则表达式,它们可以用更易读的方式编写......)

#!/bin/sh

reference=$1
shift
files=$*

# strip the permissions (whith extended regexes could be more readable)
OWNER=$(ls -l ${reference} | sed -e "s/.\(...\).*/\1/"       | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*/\1/"    | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*/\1/" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}
Run Code Online (Sandbox Code Playgroud)

更新

这更容易使用stat

chmod $( stat -f '%p' ${reference} ) ${files}
Run Code Online (Sandbox Code Playgroud)

  • 你可以解析 `stat` 输出,而不是解析 `ls -l` 输出。 (2认同)
  • 您在这里使用 *BSD `stat` 语法。你的 `chmod $(stat ...)` 命令不起作用,因为 `%p` 单独为 *BSD 的 `chmod` 输出了太多信息,使用 `%Lp` 只输出 u/g/o 位。Sticky/setuid/setgid 位需要稍微复杂一些的东西。 (2认同)