#1 楼
在GNU / Linux上,chown
和chmod
具有--reference
选项chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
#2 楼
在具有GNU实用程序的任何UNIX上,例如(非嵌入式)Linux或Cygwin,都可以使用chmod --reference
和chown --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
。但是这可能是我的配置出现问题。
评论
您能否将这个答案(并可能引用)作为对我的问题的答案: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