Answers:
在GNU / Linux上chown
并chmod
有一个--reference
选择
chown --reference=otherfile thisfile
chmod --reference=otherfile thisfile
--reference
参数上。chmod
chown
在具有GNU实用程序的任何UNIX上,例如(非嵌入式)Linux或Cygwin,都可以使用chmod --reference
和chown --reference
。
如果您的系统具有ACL,请尝试使用ACL命令getfacl
和setfacl
。这些命令因系统而异,但是您可以使用许多命令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
${*:2}
?永远不要再这样做!如果任何文件名包含空格(或制表符),那将失败。使用"${@:2}"
。另外,使用"$1"
而不是$1
。
chmod "$(stat -c '%a' "$fromfile")" tofile
在GNU Coreutils中使用,但--reference
由于stat
CLI实用程序不是POSIX,因此您也可以在这种情况下使用,它甚至说pubs.opengroup.org/onlinepubs/9699919799/utilities/ls.html ls -l
不会削减它:“ ls的输出(带有-l和相关选项)包含实用程序在逻辑上可以由chmod和touch使用的信息,以将文件还原到已知状态,但是,该信息以无法被这些实用程序直接使用或无法使用的格式显示。轻松地翻译成可以使用的格式。”
如果您不使用带有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}
ls -l
输出,您还可以解析stat
输出。
stat
这里使用* BSD 语法。您的chmod $(stat ...)
命令将不起作用,因为%p
单独为* BSD输出的信息太多chmod
,%Lp
仅用于输出u / g / o位。粘性/ setuid / setgid位需要一些更详细的说明。
我想对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
上未找到。不过,这可能是我的配置出现问题。