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

#1 楼

在GNU / Linux上,chownchmod具有--reference选项

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


评论


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

– Grzegorz Wierzowiecki
2012年7月31日在20:40

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

– Enzotib
2012年7月31日在20:54

如您所愿和建议。感谢您的帮助,我从未在:)之前关注过chmod和chown的--reference参数。

– Grzegorz Wierzowiecki
2012年7月31日在22:02

#2 楼

在具有GNU实用程序的任何UNIX上,例如(非嵌入式)Linux或Cygwin,都可以使用chmod --referencechown --reference。这些命令因系统而异,但是在许多情况下,您可以使用getfacl复制权限。这不会复制所有权;假设您没有包含空格的用户名或组名,则可以通过仔细分析setfacl来实现。

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


评论


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

– Enzotib
2011年9月14日下午4:03

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

–吉尔斯'所以-不再是邪恶的'
2011年9月14日下午6:57

#3 楼

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

代码:

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

用法:

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

评论


哎呀!您在哪里学到说$ {*:2}?永远不要再这样做!如果任何文件名包含空格(或制表符),那将失败。使用“ $ {@:2}”。另外,使用“ $ 1”,而不只是$ 1。

– G-Man说“恢复莫妮卡”
2015年5月26日下午4:10

在GNU Coreutils中将chmod“ $(stat -c'%a'” $ fromfile“)”转换为文件,但是在这种情况下,您也可以使用--reference,因为stat CLI工具不是POSIX,它甚至说pubs.opengroup.org /onlinepubs/9699919799/utilities/ls.htmlls -l不会删除它:“ ls的输出(带有-l和相关选项)包含逻辑上可由chmod等实用程序使用的信息,并且可以触摸以恢复文件但是,这些信息以不能被那些实用程序直接使用的格式显示,也很容易转换为可以使用的格式。”

– Ciro Santilli郝海东冠状病六四事件法轮功
18年9月2日,12:10

#4 楼

如果您使用的不是带有GNU chmod / chown(支持--reference选项)的系统,则可以尝试解析ls -l的输出。扩展的正则表达式,它们可以以更易读的方式编写...)

#!/bin/sh

reference=
shift
files=$*

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

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}


更新:

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


评论


代替解析ls -l输出,您可以解析statoutput。

– jfg956
2011年9月21日19:51

@jfgagne:非常有道理,我不知道为什么我没有想到它。我更新了答案

–马特奥
2011-09-22 5:28

您在此处使用* BSD stat语法。您的chmod $ {stat ...)命令将不起作用,因为仅%p会为* BSD的chmod输出太多信息,请使用%Lp仅输出u / g / o位。粘性/ setuid / setgid位需要一些更详细的说明。

–purpur先生
2013年6月7日上午10:17

#5 楼

这对我有用:

cp -p --attributes-only <from> <to>

#6 楼

我想对Matteo的脚本进行调整。在实际对文件运行chmod命令之前,应使用for循环来验证文件是否存在。

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

#!/bin/sh

reference=
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/.\(...\).*//" | sed -e "s/[-]//g" )
GROUP=$(ls -l ${reference} | sed -e "s/....\(...\).*//" | sed -e "s/[-]//g" )
OTHER=$(ls -l ${reference} | sed -e "s/.......\(...\).*//" | sed -e "s/[-]//g" )

chmod u=${OWNER},g=${GROUP},o=${OTHER} ${files}


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