我们在这里有各种各样的硬件和操作系统的机器,他们中的大多数使用代理执行的bash执行常规任务。 但是我注意到,我们拥有的一些Solaris机器没有stat util,添加它会是一个需要时间的问题(具有讽刺意味)
与此同时,我试图模仿一个macros伟的方式统计一个sisyphean任务:返回八进制文件的权限
我发现了一些在Octal-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);}'
任何人都可以提示我什么是一个好的解决scheme?
这应该处理任何权限,包括粘滞,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
您可以通过以下命令获取文件/文件夹的八进制权限:
$ find /tmp/ -printf "%m,%p\n"
这将打印在/tmp下的文件/文件夹列表,其前面是八进制的权限。 这也打印像s的特殊权限。 这只是一个例子。 您可以根据您的需要进行自定义。