我们这里有各种各样的机器,配备各种硬件和操作系统,其中大多数都使用代理执行的 bash 执行常规任务。然而,我注意到我们拥有的一些 Solaris 机器没有 stat 实用程序,添加它会是一个可能需要时间的问题(讽刺)
与此同时,我试图模仿 stat 以出色的方式完成的一项西西弗斯式的任务:以八进制返回文件权限
我发现了一些旧的例子,它以八进制打印常规权限 - rwx,但不打印“特殊”权限 - 粘性组,粘性用户等
我的基本方法是这样的:首先计算特殊位的八进制值,然后添加常规的“rwx”,但似乎效果不太好
ls -lah $file | awk '{k=0;for(i=0;i<=8;i++) {if (substr($1,i+2,1)~/[s]/) k += ((substr($1,i+2,1)~/[s]/)*2^9);else k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));}if (k)printf("%0o ",k);}'
ls -lah $file | awk '{k=0;for(i=0;i<=8;i++){k+=((substr($1,i+2,1)~/[rwxs]/)*2^(8-i));printf("%0o\n",k)}if(k)printf("%0o ",k);}'
有人能提示我什么是一个好的解决方案吗?
答案1
这应该可以处理任何权限集,包括 sticky、setuid 和 setgid(“s” 代表“set”,而不是“sticky”,后者是“t”)。打印前导零。
ls -lahd "$file" | awk '{k = 0; for (g=2; g>=0; g--) for (p=2; p>=0; p--) {c = substr($1, 10 - (g * 3 + p), 1); if (c ~ /[sS]/) k += g * 02000; else if (c ~ /[tT]/) k += 01000; if (c ~ /[rwxts]/) k += 8^g * 2^p} if (k) printf("%05o ", k)}'
为了便于阅读,这里将其分为多行:
awk '{k = 0;
for (g=2; g>=0; g--)
for (p=2; p>=0; p--) {
c = substr($1, 10 - (g * 3 + p), 1);
if (c ~ /[sS]/)
k += g * 02000;
else
if (c ~ /[tT]/)
k += 01000;
if (c ~ /[rwxts]/)
k += 8^g * 2^p
}
if (k) {
printf("%05o ", k);
}'
演示:
$ touch foo
$ chmod 7654 foo
$ ls -l foo
-rwSr-sr-T 1 user user 0 2012-01-29 13:21 foo
$ ls -l foo | awk '...'
07654
答案2
您可以使用以下命令获取文件/文件夹的八进制权限:
$ find /tmp/ -printf "%m,%p\n"
这将打印以下文件/文件夹的列表,/tmp
并以八进制格式显示权限。这还会打印特殊权限,例如s
。这只是一个例子。您可以根据需要进行自定义。