有一个修改模式命令来设置文件权限,但是我可以从命令行获取八进制模式(例如755)的文件权限吗?
答案1
你可以试试
stat -c "%a %n" *
替换*
为您想要检查的相关目录或确切文件名。
来自stat 的手册页,
-c --format=FORMAT
use the specified FORMAT instead of the default; output a newline after
each use of FORMAT
%a Access rights in octal
%n File name
用法:
带有文件:
$ stat -c "%a %n" ./Documents/Udev.html 664 ./Documents/Udev.html
使用文件夹:
$ stat -c "%a %n" ./Documents/ 755 ./Documents/
答案2
可以使用 Linux stat 命令以八进制格式显示 Linux 中的文件权限。
只需按下键盘上的Ctrl++即可打开终端。打开后,导航到您想要以八进制模式查找文件权限的目录Alt。T
stat -c '%A %a %n' *
%A 以人类可读的形式表示的访问权限
%a 八进制访问权限
%n 文件名
八进制数和权限
您可以使用八进制数来表示模式/权限:
r: 4 w: 2 x: 1
例如,对于文件所有者,你可以使用八进制模式,如下所示。八进制中文件的读取、写入和执行(完全)权限为 0+r+w+x = 0+4+2+1 = 7
八进制文件的读写权限仅为 0+r+w+x = 0+4+2+0 = 6
八进制中文件的读取和执行权限仅为 0+r+w+x = 0+4+0+1 = 5
使用上述方法计算组和其他人的权限。假设您希望授予所有者完全权限,授予组读取和执行权限,并授予其他人只读权限,则需要按如下方式计算权限:用户 = r+w+x = 0+4+2+1 = 7 组 = r+w+x = 0+4+2+0 = 6 其他 = r+w+x = 0+0+0+1 = 1
有效权限为761。
答案3
详情使用 'ls' 的“755”式权限经过亚当·库尔特曼什在AgileAdam.com,您可以创建别名 lso
它的作用类似于ls -l
但稍微处理输出1以八进制显示权限。这将添加一个前导列,显示三位数2八进制权限。正如所写,这适用于大多数文件和目录,但如果黏或者设置用户标识/设置gid位已设置。3
alias lso="ls -alG | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\" %0o \",k);print}'"
但这有一个严重的缺点,因为泰克托尼克 指出。 你无法传递参数lso
就像你希望的那样命令ls
因为它们被视为awk
因此,您无法lso
在特定文件或目录上运行,也无法将任何选项(如-F
、 或--color
)传递给lso
。
解决方法是定义lso
作为一个功能而不是别名。
lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
如果您在 shell 中以交互方式尝试此操作,请运行unalias lso
以删除别名——您可以在定义函数之前或之后执行此操作。如果您将其放入源文件中,例如~/.bashrc
,只需取出该alias
行并添加函数定义。
为什么这会起作用?与别名不同,bash shell 函数可以接受位置参数, IE,命令行参数。"$@"
扩展为完整参数列表,导致函数的参数lso
被传递给ls
。(与别名定义不同,函数体没有被引用;因此需要删除和\
之前的字符。)$
"
由于您可以将选项传递给lso
以此方式定义为函数的函数,因此您可能希望从定义中删除-a
和-G
选项 - 您可以在需要它们的情况下手动传递它们。(需要该-l
选项才能显示文件权限等详细信息根本,因此删除它没有任何好处。)
lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
谢谢泰克托尼克为了指出局限性定义lso
为别名,从而促使我扩展这篇文章的内容,添加有关使其成为一个函数的内容。
1有人可能会注意到,这似乎藐视不解析输出的一般规则ls
.ls
产生非常人性化的输出;但这会引入一些特性和限制,使得它通常不适合作为其他命令的输入。在这种情况下我们解析ls
因为我们希望保留ls
除了我们的一添加了更改。
2此别名的一个限制(也适用于其下面显示的函数版本,并且可能被视为错误)是它仅显示三个八进制数字即使第四个八进制数字是零。作为杰富美有正确指出,此处显示的八进制数字不反映粘滞位(如果存在),也不反映 setuid 或 setgid 位。
3比仅仅不显示第四个八进制数字更严重的是,这种方法假设它们尚未设置,并且如果是——如果你看到t
,,s
或S
在权限字符串中。这是因为这些位是从权限字符串推断出来的,并且没有考虑粘性 setuid/setgid 位。
答案4
为了便于携带,您可以使用perl
:
$ perl -e 'printf "%04o %s\n", (stat)[2] & 07777, $_ for @ARGV' *.txt
0644 1.txt
0644 2.txt
0644 3.txt
0644 4.txt
0600 PerlOneLiner.txt
0664 perl.txt
如果您想注意到错误何时发生,请尝试:
perl -e '
for (@ARGV) {
print "$!: $_\n" and next unless -e;
printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt