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


125

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

Answers:


175

在GNU / Linux上chownchmod有一个--reference选择

chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile

1
您能否将这个答案(并可能引用)作为对我的问题的答案:unix.stackexchange.com/questions/44253/…?,我认为我将是非常棒的补充,我很乐意在那里找到赞成票。
Grzegorz Wierzowiecki 2012年

@GrzegorzWierzowiecki:可能应该关闭该问题,但与此问题有所不同并且已经有答案,所以我最好什么也不做。
enzotib 2012年

如您所愿和建议。感谢您的帮助,我从没把注意力放在和::之前的--reference参数上。chmodchown
Grzegorz Wierzowiecki 2012年

12

在具有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

1
您应该已安装ACL,并且已启用ACL来安装文件系统。
enzotib

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

7

是否根据Matteo的响应执行bash命令:)

码:

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

用法:

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


5
阿加德!你在哪里学着说${*:2}?永远不要再这样做!如果任何文件名包含空格(或制表符),那将失败。使用"${@:2}"。另外,使用"$1"而不是$1
G-Man

chmod "$(stat -c '%a' "$fromfile")" tofile在GNU Coreutils中使用,但--reference由于statCLI实用程序不是POSIX,因此您也可以在这种情况下使用,它甚至说pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html ls -l不会削减它:“ ls的输出(带有-l和相关选项)包含实用程序在逻辑上可以由chmod和touch使用的信息,以将文件还原到已知状态,但是,该信息以无法被这些实用程序直接使用或无法使用的格式显示。轻松地翻译成可以使用的格式。”
Ciro Santilli新疆改造中心法轮功六四事件

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}

更新

使用stat以下方法更容易:

chmod $( stat -f '%p' ${reference} ) ${files}

2
除了解析ls -l输出,您还可以解析stat输出。
jfg956 2011年

@jfgagne:谢谢,我不知道为什么我一开始就没有考虑。我更新了答案
Matteo

1
您在stat这里使用* BSD 语法。您的chmod $(stat ...)命令将不起作用,因为%p单独为* BSD输出的信息太多chmod%Lp仅用于输出u / g / o位。粘性/ setuid / setgid位需要一些更详细的说明。
spuratic先生,2013年

0

我想对Matteo的脚本进行调整。在实际对文件运行chmod命令之前,应使用for循环来验证文件是否存在。这将使脚本更优雅地输出错误。

我认为这是最好的选择,因为它可以用于所有* nix操作系统,例如Solaris,Linux等。

#!/bin/sh

reference=$1
shift
files=$*

for file in $reference $files; do
  [ -f $file ] || { echo "$file does not exist"; exit 1; }
done

# 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}

我发现在我的一台Solaris 10计算机stat上未找到。不过,这可能是我的配置出现问题。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.