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

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

有一个修改模式命令来设置文件权限,但是我可以从命令行获取八进制模式(例如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++即可打开终端。打开后,导航到您想要以八进制模式查找文件权限的目录AltT

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。

来源:http://kmaiti.blogspot.com/2011/09/umask-concept.html

答案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,,sS在权限字符串中。这是因为这些位是从权限字符串推断出来的,并且没有考虑粘性 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

相关内容