【发布时间】:2018-04-01 12:09:32
【问题描述】:
我需要得到Access rights in more human readable 格式的文件或文件夹,带有symbolic 符号,如u=rwx,g=srwx,o-rwx(可能是粘性位)
- 使用
stat --format '%a',我得到格式为2770,八进制格式的结果 - 使用
stat --format '%A',我得到格式为drwxrws---的结果,人类可读
我需要一个命令来获取像u=rwx,g=srwx,o-rwx这样的格式(兼容chmod symbolic modes)
-
[u|g|o]:user/group/other或a所有人 -
[=]: 授予权利 -
[rwxst]: 授予无顺序重要性的权利列表 -
[-rwx]:撤销权利(如果未授予权利)
我试过这个(但它不能处理所有情况,特别是粘性位):
stat --format '%A' temp |
sed -E 's/^.(...)(...)(...)/u=\1,g=\2,o=\3/g' | # split by triplet
sed 's/=---/-rwx/g' | # revoker grants
sed 's/rws/srwx/g' | # setgid with x ...
sed 's/--S/s/g' | # setgid without x ...
sed ... nead more transormation... # manage sticky bit setuid setgid
我寻找一种更优雅的方式。
示例输入 ==> 输出
-
drwxrws---==>u=rwx,g=srwx,o-rwx(以 d ==> 目录开头) -
drwxrwxrwx==>u=rwx,g=rwx,o=rwx或ugo=rwx或a=rwx -
-r-xrw-r--==>u=rx,g=rw,o=r(以 - ==> 常规文件开头) -
-rwx--S---==>u=rwx,g=s,o-rwx(S 大写) -
------s--t==>u=-srwx,g=sx,o=xt(Stickybit)
输入格式 ==> 类似命令stat 或ls -al
输出格式==> 必须兼容chmod
这个完整的版本看起来可行,但我相信我们可以简化它,(即没有多个 sed)
stat --format '%A' a |
sed -E 's/^.(...)(...)(...)/u=\1,g=\2,o=\3/g' | # split by triplet
sed -E 's/s/xs/g' | # setgid ou setuid with x ...
sed -E 's/t/xt/g' | # sticky bit with x ...
sed -E 's/S/s/g' | # setgid ou setuid without x ...
sed -E 's/T/t/g' | # sticky bit alone
sed -E 's/-//g' | # remove -
sed -E 's/=(,|$)/-rwx\1/g' # revoker grants
【问题讨论】:
-
为什么要投反对票?请解释一下。
-
因为您要求别人为您编写代码而您不费吹灰之力。
-
好的,我已经更新了我的临时解决方案(我没有发布这个不影响回答)
-
您的规格不完整。例如,您希望
r-xrw-r--输出什么? -
-r-xrw-r--可以返回u=rx,g=rw,o=r(顺序不重要)
标签: linux bash unix permissions stat