使用 awk 以八进制表示文件/文件夹权限?

使用 awk 以八进制表示文件/文件夹权限?

我们这里有各种各样的机器,配备各种硬件和操作系统,其中大多数都使用代理执行的 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。这只是一个例子。您可以根据需要进行自定义。

相关内容