#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比只显示第四个八进制数字更重要的是假设未设置它们,并且如果它们未设置-如果您在权限字符串中看到
ls
,t
或s
,则您应该忽略八进制数字。这是因为这些位是从权限字符串中推断出来的,而不会考虑粘性的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
。命令。另一种方法(
ls
和awk
)此方法可用于列出具有权限的所有目录文件:
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函数编写。
评论
对于像我这样的人,他们不小心进入了此页面,但实际上正在Mac上搜索操作方法:stackoverflow.com/a/14855227/470749stat --format“%A” $ FILE为您提供可读的drwxr-x ---格式。可能有用也可能没有用。