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

Anw*_*war 453 permissions command-line

有一个chmod命令可以设置文件权限,但是我可以从命令行获取八进制模式(例如 755)的文件权限吗?

jok*_*ino 640

你可以试试

stat -c "%a %n" *
Run Code Online (Sandbox Code Playgroud)

替换*为相关目录或您要检查的确切文件名。

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
Run Code Online (Sandbox Code Playgroud)

用法:

(参考)

  • 在 mac os 上,使用 `stat -f '%A %a %N' *`(信用:http://geeklog.adamwilson.info/article/58/getting-file-permissions-in-octal-on-OS- X) (67认同)
  • @usandfriends 在 `ls` 的输出上循环是一个坏主意。如果你真的想使用循环,你可以做 `for f in *; 做 stat "%a %n" "$f"; 完成` (5认同)
  • 为什么在 mac os 上一切都略有改变(即使在 unix iso utils 中)?这有实际的原因吗? (2认同)
  • 请@hackel,告诉我们您的真实感受。哈哈! (2认同)
  • @Vassilis 回答:知道。您真正要问的问题是:“如果 BSD 在 Linux 之前出现,为什么 Linux 改变标准而不是遵循旧 UNIX 系统设置的模式?”。 (2认同)

Mit*_*tch 62

Linux 中的文件权限可以使用 Linux stat 命令以八进制格式显示。

只需按键盘上的Ctrl+ Alt+T即可打开终端。当它打开时,导航到要在八进制模式下查找文件权限的目录。

stat -c '%A %a %n' *
Run Code Online (Sandbox Code Playgroud)

%A 人类可读形式的访问权限

%a 八进制访问权限

%n 文件名

八进制数和权限

您可以使用八进制数来表示模式/权限:

r: 4
w: 2
x: 1
Run Code Online (Sandbox Code Playgroud)

例如,对于文件所有者,您可以使用八进制模式,如下所示。八进制文件的读、写和执行(完全)权限是 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

使用上述方法计算组和其他人的权限。假设您希望授予所有者完全权限,授予组的读取和执行权限,并授予其他人只读权限,那么您需要按如下方式计算权限:User = 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

  • 最初的 0 也代表特殊位:http://pastebin.com/6ymkFt71 (2认同)

Eli*_*gan 43

如在详细描述“755”式的权限与“LS”亚当CourtemancheAgileAdam.com,可以创建一个别名 lso,其作用类似于ls -l但输出稍微处理1到显示权限也以八进制。这会添加一个显示三位数2八进制权限的前导列。正如所写,这适用于大多数文件和目录,但如果设置了stickysetuid/setgid位,它就不能正常工作。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}'"
Run Code Online (Sandbox Code Playgroud)

但是,正如techtonik 指出的那样,这有一个严重的缺点。你不能传递参数给这个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}'; }
Run Code Online (Sandbox Code Playgroud)

如果您在 shell 中unalias lso以交互方式尝试此操作,请运行以删除别名——您可以在定义函数之前或之后执行此操作。如果要将其放入源文件中,例如~/.bashrc,只需取出该alias行并添加函数定义。

为什么这样做?与别名不同,bash shell 函数可以采用位置参数,即命令行参数"$@"扩展到完整的参数列表,导致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}'; }
Run Code Online (Sandbox Code Playgroud)

由于techtonik指出的限制定义lso为一个别名,从而激励我与材料扩大这篇文章关于使其成为一个功能来代替。


1人们可能会注意到这似乎无视关于不解析来自ls. ls产生非常可读的输出;这引入了特性和限制,使其通常不适合作为其他命令的输入。在这种情况下,我们分析ls,因为我们希望保留的具体行为ls,除了我们的一个补充的变化。

2这个别名的一个限制,也适用于它下面显示的函数版本,可能被认为是一个错误,是它只显示三个八进制数字,即使第四个八进制数字为零。作为jfmercer已经正确地指出,八进制数字显示这里并没有反映如果存在的话,也不是setuid或setgid位sticky位。

3不仅仅是没有显示第四八进制数字更为严重的是,这种方法假设他们没有设置,并且如果他们是-如果你看到ts或者S在权限字符串-那么你应该忽略八进制数字。这是因为这些位是从权限字符串中以不考虑粘性 setuid/setgid 位的方式推断出来的。

  • 你可以添加`--color`参数来显示颜色`lso() { ls -alG "$@" --color | awk '{k=0;for(i=0;i&lt;=8;i++)k+=((substr($1,i+2,1)~/[rwx]/)*2^(8-i)) ;if(k)printf(" %0o ",k);print}'; }` (2认同)

小智 25

只是扩展\简化以前的“统计”相关答案:

你可以简单地运行:

stat <path_to_file>
Run Code Online (Sandbox Code Playgroud)

输出将包含八进制权限以及其他信息。



详细信息(统计版本和示例):

# stat --version
stat (GNU coreutils) 8.4
Run Code Online (Sandbox Code Playgroud)


[user@localhost ~]# touch /tmp/TEST_PERMISSONS

[user@localhost ~]# chmod 644 /tmp/TEST_PERMISSONS

[user@localhost ~]# stat /tmp/TEST_PERMISSONS
  File: `/tmp/TEST_PERMISSONS'
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d    Inode: 1010058     Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-26 18:58:59.000000000 +0300
Modify: 2015-08-26 18:58:59.000000000 +0300
Change: 2015-08-26 18:59:16.000000000 +0300
Run Code Online (Sandbox Code Playgroud)

注意:(0644 /-rw-r--r--)


cuo*_*glm 9

为了便携性,您可以使用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
Run Code Online (Sandbox Code Playgroud)

如果您想在发生错误时注意,请尝试:

perl -e '
for (@ARGV) {
    print "$!: $_\n" and next unless -e;
    printf "%03o %s\n", (stat)[2] & 07777, $_;
}
' *.txt
Run Code Online (Sandbox Code Playgroud)

  • 除了便携之外,@cuonglm 的解决方案显示了 _four_ 八进制字符而不是 _three_,从而显示了经常被遗忘的“粘滞位”的状态。 (2认同)