通过使用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