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

评论

对于像我这样的人,他们不小心进入了此页面,但实际上正在Mac上搜索操作方法:stackoverflow.com/a/14855227/470749

stat --format“%A” $ FILE为您提供可读的drwxr-x ---格式。可能有用也可能没有用。

#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/



(参考)

评论


在Mac OS上,使用stat -f'%A%a%N'*(来源:geeklog.adamwilson.info/article/58/…)

– s2t2
15年4月15日在22:07

如果您更喜欢ls:在$(ls -a)中使用f;执行stat -c“%a%n” $ f;完成

–rgajrawala
15年7月18日在19:00

@usandfriends在ls的输出上循环是一个坏主意。如果您确实想使用循环,则可以在*中为f做;执行stat“%a%n”“ $ f”;完成

– Tom Fenech
16年2月18日在10:12

为什么在Mac OS上,所有内容都会略有变化(甚至在UNIX iso utils中)?这有实际原因吗?

–Vassilis
16年8月21日在2:32



请@hackel,告诉我们您的真实感受。大声笑!

– MikeSchinkel
17年5月30日在7:31

#2 楼

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

只需按键盘上的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

使用上述方法可以计算组和其他用户的权限。让我们
说您希望授予所有者完全的权限,读取并执行
对组的权限,并且仅向其他人授予权限,那么您需要
来计算权限,如下所示: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也代表特殊位:pastebin.com/6ymkFt71

–脑袋
13年7月28日在1:45

#3 楼

如AgileAdam.com上亚当·科特曼奇(Adam Courtemanche)的“ 755”式“ ls”权限中所详细描述的,您可以创建别名lso,其行为类似于ls -l,但会稍微处理output1以八进制显示权限。这将添加一个前导列,显示三位数2八进制权限。如所写,这适用于大多数文件和目录,但是如果设置了sticky或setuid / 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}'"
 


但是,正如techtonik指出的那样,这有一个严重的缺点。您无法像传递给lso命令一样将参数传递给该ls别名,因为它们被当作awk的附加参数。因此,您无法在特定文件或目录上运行lso,也不能将任何选项(例如-F--color)传递给lso


解决方法是将lso定义为函数而不是别名。

 lso() { ls -alG "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; }
 


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

为什么这样做?与别名不同,bash shell函数可以采用位置参数,即命令行参数。 "$@"扩展到完整的参数列表,导致lso函数的参数传递给ls。 (与别名定义不同,没有引用函数主体;因此必须删除\$之前的"字符。)

由于通过这种方式将选项定义为函数时可以将选项传递给lso,因此您可能希望从定义中删除-a-G选项-如果需要,可以手动传递它们。 (-l选项是必需的,以便完全显示文件许可权之类的详细信息,因此删除它没有任何好处。) / pre>

感谢techtonik指出了将lso() { ls -l "$@" | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(" %0o ",k);print}'; } 定义为别名的局限性,从而激发了我在这篇文章中扩展有关使其成为函数的内容。


1可能有人注意到这似乎违反了关于不解析lso的输出的一般规则。 ls产生非常易于理解的输出;这引入了特质和限制,使其通常不适合用作其他命令的输入。在这种情况下,我们解析ls,是因为我们希望保留ls的确切行为,只是增加了一个改动。

2该别名的一个限制,也适用于下面显示的功能版本,并且可能被认为是一个错误,因为即使第四个八进制数字为零,它也只显示三个八进制数字。正如jfmercer正确指出的那样,此处显示的八进制数字不能反映粘性位(如果存在的话),也不能反映setuid或setgid位。

3比只显示第四个八进制数字更重要的是假设未设置它们,并且如果它们未设置-如果您在权限字符串中看到lsts,则您应该忽略八进制数字。这是因为这些位是从权限字符串中推断出来的,而不会考虑粘性的setuid / setgid位。

评论


不适用于目录-awk:读取错误(是目录)

–anatoly techtonik
2014年7月25日在7:25

@techtonik感谢您指出这一点!我(最后)更新了此答案,以包括针对此问题的修复程序。

– Eliah Kagan
2015年4月10日在20:37

您可以为显示颜色添加--color参数lso(){ls -alG“ $ @” --color | 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}'; }

–tagplus5
17 Mar 13 '17 at 0:03

自发布此消息以来,您是否找到解决粘性setuid / setgid问题的解决方案?

– Silvestris
19 Mar 3 '19 4:00

#4 楼

只需扩展\简化先前的“ stat”相关答案:

您可以简单地运行:

stat <path_to_file>


输出将包含八进制许可以及其他info。

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

# stat --version
stat (GNU coreutils) 8.4




[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


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

#5 楼

为了实现可移植性,可以使用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


评论


除了具有可移植性之外,@ cuonglm的解决方案还显示四个八进制字符而不是三个八进制字符,从而显示了经常被遗忘的“粘性位”的状态。

– jfmercer
15年7月22日在14:28

如何显示隐藏文件?

– MaXi32
5月14日21:28

@ MaXi32使用。*

–cuonglm
5月15日下午2:45

#6 楼

您可以将find-printf操作一起使用。

ls不显示八进制权限,但是您可以使用基于find的变通方法: bash prettyprint-override“> find path -printf "%m:%f\n"

例如,检查我的视频目录:

$ find Videos -printf "%m:%f\n"
755:Videos


%m格式说明符告诉-printf操作可打印八进制权限,而%f格式说明符则使它打印文件名。

您可以将多个文件名传递给find。您甚至可以使用glob(例如find * -printf "%m:%f\n")。

您不必使用-name-iname之类的测试;将您感兴趣的文件或目录的名称作为起点传递到find就足够了。也就是说,如上所示,在单词find之后立即提供其名称作为参数。

find使您可以很好地控制其显示输出的方式。特别有两个修改可能对您有用:




默认情况下,find递归子目录,类似于ls -R。如果您不希望find访问传递给它的起点的子目录,则可以添加-maxdepth 0(或将-maxdepth与其他值一起使用,以表明您希望它走多深)。
$ find Documents -maxdepth 0 -printf "%m:%f\n"
755:Documents



%f仅显示文件名,因此如果find必须递归才能获取文件,则可能不知道文件的位置。要显示路径,从找到文件的起始位置开始,请改用%p

$ find /boot -printf "%m:%p\n"
755:/boot
644:/boot/initrd.img-4.4.0-92-generic
600:/boot/System.map-4.4.0-93-generic
600:/boot/vmlinuz-4.4.0-92-generic
600:/boot/vmlinuz-4.4.0-93-generic
....



有关使用man find的更多信息,请参见find。命令。

另一种方法(lsawk

此方法可用于列出具有权限的所有目录文件:

ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(,i+2,1)~/[rwx]/) \
             *2^(8-i));if(k)printf("%0o ",k);print}'


这实际上与Adam Courtemanche的lso别名中的命令相同,该答案引用了该别名,只是作为单个命令运行。如果只使用一次,或者在极少数情况下使用,则可能不希望将其作为别名或shell函数编写。