如何从命令行获取二进制文件权限?

如何从命令行获取二进制文件权限?

通过使用stat -c "%a %n" * 我以八进制模式获取文件权限(例如 755),有没有办法以二进制模式查看文件权限(例如 111 101 101)?

答案1

对于单个文件:

stat -c "%a" filename.txt | xargs -I PERM echo "obase=2; ibase=8; PERM" | bc

并且对于多个文件来说,有更清晰的脚本:

#!/bin/bash
for file in *
do
  perm=$(stat -c "%a" "$file")
  bin=$(echo "obase=2; ibase=8; $perm" | bc)
  echo "$bin $file"
done

输出:

110110100 baz
110110100 foo
110110101 bar

笔记

  • 首先,我们使用循环到所有文件和目录for file in *
  • 我们以stat -c "%a八进制形式收集文件权限,然后
  • 使用echo我们添加其他必要的细节permission并将其添加到bc
  • 最后bc进行转换,然后打印出结果和文件名。
  • obase=2; 表示输出应该是二进制的,ibase=8 表示我们的输入是八进制的,$perm 是八进制的文件权限,如 664。

答案2

你可以使用 perl 来做到这一点统计模块例如给定

$ stat -c '%a %n' *
600 other file
775 somedir
664 somefile

然后

$ perl -MFile::stat -e 'printf "%b %s\n", (stat $_)->[2] & 07777, $_ for @ARGV' *
110000000 other file
111111101 somedir
110110100 somefile

答案3

如果你只是想可视化二进制文件权限,您可以使用第一列ls -l

$ ls -ld /bin
drwxr-xr-x 2 root root 4096 mai 18 05:38 /bin

在这里你可以看到rwxr-xr-x对应于111101101

答案4

Python

$ python -c 'import sys,os;[ sys.stdout.write( " ".join([bin(os.stat( i ).st_mode)[-9:],i,"\n"]) ) for i in sys.argv[1:] ]' /etc/passwd
110100100 /etc/passwd 

该任务通过函数完成os.stat(),该函数返回文件属性的元组,其中是st_mode十进制格式。然后我们将其转换为二进制,并提取最后 9 位数字。

所有操作均在列表推导中执行,以操作命令行中给出的所有文件(因此您可以提供多个文件或使用 globstar)。

作为脚本

#!/usr/bin/env python2

import sys, os

for filename in sys.argv[1:]:
    perms = os.stat(filename).st_mode
    print bin(perms)[-9:], filename

相关内容