Anw*_*war 453 permissions command-line
有一个chmod命令可以设置文件权限,但是我可以从命令行获取八进制模式(例如 755)的文件权限吗?
jok*_*ino 640
你可以试试
stat -c "%a %n" *
Run Code Online (Sandbox Code Playgroud)
替换*
为相关目录或您要检查的确切文件名。
-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)
用法:
带文件:
$ stat -c "%a %n" ./Documents/Udev.html
664 ./Documents/Udev.html
Run Code Online (Sandbox Code Playgroud)带文件夹:
$ stat -c "%a %n" ./Documents/
755 ./Documents/
Run Code Online (Sandbox Code Playgroud)Mit*_*tch 62
Linux 中的文件权限可以使用 Linux stat 命令以八进制格式显示。
只需按键盘上的Ctrl+ Alt+T即可打开终端。当它打开时,导航到要在八进制模式下查找文件权限的目录。
stat -c '%A %a %n' *
Run Code Online (Sandbox Code Playgroud)
%A 人类可读形式的访问权限
%a 八进制访问权限
%n 文件名
八进制数和权限
您可以使用八进制数来表示模式/权限:
Run Code Online (Sandbox Code Playgroud)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
Eli*_*gan 43
如在详细描述“755”式的权限与“LS”由亚当Courtemanche上AgileAdam.com,可以创建一个别名 lso
,其作用类似于ls -l
但输出稍微处理1到显示权限也以八进制。这会添加一个显示三位数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}'"
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不仅仅是没有显示第四八进制数字更为严重的是,这种方法假设他们没有设置,并且如果他们是-如果你看到t
,s
或者S
在权限字符串-那么你应该忽略八进制数字。这是因为这些位是从权限字符串中以不考虑粘性 setuid/setgid 位的方式推断出来的。
小智 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--)
为了便携性,您可以使用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)