如何通过字符串获取许可号:-rw-r--r--


53

我需要设置相同的chmod,如何获取-rw-r--r--的数字


2
以编程方式还是只需要知道如何翻译?
mattdm 2012年

我懒洋洋地翻译:)统计数据对我来说暂时还好。
2012年

9
“设置相同”是什么意思?您是否已经拥有一个具有-rw-r--r--权限的文件,并且想要设置具有相同权限的另一个文件?然后查看您是否chmod支持--reference:“-reference = RFILE使用RFILE的模式而不是MODE值” – man chmod。
manatwork


您正在使用什么Unix?
Kusalananda

Answers:


53

请检查stat输出:

# stat .xsession-errors 
  File: ‘.xsession-errors’
  Size: 839123          Blocks: 1648       IO Block: 4096   regular file
Device: 816h/2070d      Inode: 3539028     Links: 1
Access: (0600/-rw-------)  Uid: ( 1000/     lik)   Gid: ( 1000/     lik)
Access: 2012-05-30 23:11:48.053999289 +0300
Modify: 2012-05-31 07:53:26.912690288 +0300
Change: 2012-05-31 07:53:26.912690288 +0300
 Birth: -

11
stat -c %a /path/to/file是您需要的魔术。
fromnaboo 2012年

答案在上方的“访问”块中。他在示例中使用的文件与问题中的文件具有不同的访问集。问题中的那个应该显示访问:(0644 / -rw-r--r--)
nycynik 2014年


26

完全权限模式编号是一个4位数的八进制数字,尽管在大多数情况下,您仅使用3个最低有效数字。将权限字符串中的每个组加起来,取r = 4,w = 2,x = 1。例如:

 421421421
-rwxr-xr--
 \_/        -- r+w+x = 4+2+1 = 7
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+_ = 4+0+0 = 4     => 0754

现在,有时您会看到如下所示的奇数模式字符串:

-rwsr-xr-T

第四位重载到模式x字符串中的位上。如果您看到的字母不是该字母x,则表示已设置这些“特殊”第四位中的一个,如果该字母是小写字母,则x还将设置该位置。因此,此翻译为:

   4  2  1
 421421421
-rwsr-xr-T
   +  +  +  -- s+_+T = 4+0+1 = 5  
 \_/        -- r+w+s = 4+2+1 = 7  (s is lowercase, so 1)
    \_/     -- r+_+x = 4+0+1 = 5
       \_/  -- r+_+T = 4+0+0 = 4  (T is uppercase, so 0)   => 05754

显示数字是八进制的标准UNIX方法是从零开始。chmod无论如何,GNU 都会假设您提供的模式是八进制的,但是最安全的做法是将零添加在前面。

最后,如果+在模式字符串的末尾看到a :

-rwxr-xr-x+

那么这意味着该文件具有扩展权限,并且您将需要多个权限chmod。对于入门者,请查看setfaclgetfacl命令。


10

这可能很简单

-bash-3.2$ stat --format=%a sample_file
755

3

权限只是二进制数的字符串表示形式。
0主要由代表-,其余的都是字母。

基本的

对于基本权限:

将全部转换为-caps STto 0,其余代表1
这样构造的结果二进制数应打印为八进制:

$ a=-rw-r--r--
$ b=${a//[ST-]/0}
$ b=${b//[!0]/1}
$ printf '%04o\n' $((2#$b))
0644

一行:

$ b=${a//[ST-]/0}; b=${b//[!0]/1}; printf '%04o\n' $((2#$b))
0644

纠错并检测其他3位10002000或者4000需要更多代码:

#!/bin/bash

Say     (){ printf '%s\n' "$@"; }
SayError(){ a=$1; shift; printf '%s\n' "$@" >&2; exit "$a"; }

e1="Permission strings should have 10 characters or less"
e2="Assuming first character is the file type"
e3="Permission strings must have at least 9 characters"
e4="Permission strings could only contain 'rwxsStT-'"

a=$1

((${#a}>10))  &&   SayError 1 "$e1"
((${#a}==10)) && { Say        "$e2"; a=${a#?}; }
((${#a}<9))   &&   SayError 2 "$e3"
a=${a//[^rwxsStT-]}
((${#a}<9))   &&   SayError 3 "e4"
b=${a//[ST-]/0}; b=${b//[!0]/1}; c=0
[[ $a =~ [sS]......$ ]] && c=$((c|4)) 
[[ $a =~    [sS]...$ ]] && c=$((c|2)) 
[[ $a =~       [tT]$ ]] && c=$((c|1))

printf '%04o\n' "$((2#$b|c<<9))"

0

获取具有其字符串和十六进制权限值的文件列表。将%N放在末尾,以便将输出轻松放入Excel。

stat -c "%A %a %N" *

-rw-r--r-- 644 `file2.txt'
-rw-r--r-- 644 `file3.txt'
-rw-r--r-- 644 `file4.txt'
-rw-r--r-- 644 `file.txt'
drwxr-xr-x 755 `hsperfdata_root'
-rw-r--r-- 644 `junk.txt'
drwx------ 700 `vmware-root'

这将查找具有特定十六进制权限的所有文件。

find /tmp1 -user root -perm 644

-2

对于目录中的所有并发文件

-bash-4.1$ chmod -R 640 *

对于所有文件

-bash-4.1$ chmod 640 *
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.