Unix list 命令 'ls' 可以输出数字 chmod 权限吗?

Posted

技术标签:

【中文标题】Unix list 命令 \'ls\' 可以输出数字 chmod 权限吗?【英文标题】:Can the Unix list command 'ls' output numerical chmod permissions?Unix list 命令 'ls' 可以输出数字 chmod 权限吗? 【发布时间】:2010-12-20 05:44:45 【问题描述】:

列出目录时是否可以查看数字unix权限例如644而不是符号输出-rw-rw-r--

谢谢。

【问题讨论】:

【参考方案1】:

几乎可以..

 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'

【讨论】:

要将其创建为别名(以下示例:'cls' 命令),请使用:alias cls="ls -l | 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'" 我复制并粘贴了 danger89 中的行,发现奇怪的是输出以每行 %0..o 开头,而不是说 755。如果其他人遇到此问题,原因似乎是0 和 o 之间的隐藏字符。删除后,命令设置得很好。干杯! 我认为存在计算问题。在chmod 777 dir 之后,您的命令将权限打印为767 正如唐娜所说,0 和 o 之间有一个有趣的字符(或 2),而且奇怪的是,看起来 SO 正在添加它...... 这无法识别位 t 和 s。您应该使用“stat”命令来获取文件权限信息。手动计算会出错!【参考方案2】:

假设您知道要查找哪些文件,我能想到的最接近的(保持足够简单)是stat。如果没有,* 可以找到大部分:

/usr/bin$ stat -c '%a %n' *
755 [
755 a2p
755 a2ps
755 aclocal
...

它开箱即用地处理粘性、suid 和公司:

$ stat -c '%a %n' /tmp /usr/bin/sudo
1777 /tmp
4755 /usr/bin/sudo

【讨论】:

这在 Linux 下效果很好,我发现 stat -f '%A %N' * 在 mac (FreeBSD) 上做同样的事情 我猜这个论点是 stat 不是 ls 因此这不是正确的答案。但是,我相信这是在所需输出的上下文中的正确答案。如果在管道中允许awk,则在-exec 中调用stat 时应允许find;那么你可以不用*直接使用stat 这要短得多,并且 100% 在任何系统上工作 如果要使用stat递归查看权限,bash下使用stat -c '%a %n' * **/* 根据man stat -c or --format%a access rights in octal (note '#' and '0' printf flags), %n file【参考方案3】:

你可以只使用 GNU find。

find . -printf "%m:%f\n"

【讨论】:

这是我能真正记住的命令。有用且有效。 这也应该有-maxdepth 1选项,否则会遍历整个目录树。【参考方案4】:

您可以使用以下命令

stat -c "%a %n" *

您也可以使用任何filenamedirectoryname 代替* 来获得特定结果。

在 Mac 上,您可以使用

stat -f '%A %N' *

【讨论】:

对我不起作用。 stat: illegal option -- cusage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...] 适用于 ubuntu 14.04.. 永远不必记住这一点我在我的 .bashrc 中添加了一个别名: alias xxx="stat -c '%a %n' *" 有帮助!你如何挖掘出 %A,它甚至没有出现在 Mac 上的 man of stat 中? 它实际上是一个 FreeBSD 命令,而 Mac 恰好是在此基础上构建的,使用它作为上层内核。 如果我们只在 macOS 10.14.4 上使用man stat 中提供的信息,那么命令应该是stat -f "%Lp %N" *%Lp 似乎打印与 %A 相同的内容。【参考方案5】:

@MYYN

哇,好棒的 awk!但是suid、sgid和sticky bit呢?

你必须用 s 和 t 扩展你的过滤器,否则它们不会被计算在内,你会得到错误的结果。要计算此特殊标志的八进制数,过程相同,但索引为 4 7 和 10。设置了执行位的文件的可能标志是 ---s--s--t amd 对于没有设置执行位的文件是 ---S--S--T

ls -l | awk '
    k = 0
    s = 0
    for( i = 0; i <= 8; i++ )
    
        k += ( ( substr( $1, i+2, 1 ) ~ /[rwxst]/ ) * 2 ^( 8 - i ) )
    
    j = 4 
    for( i = 4; i <= 10; i += 3 )
    
        s += ( ( substr( $1, i, 1 ) ~ /[stST]/ ) * j )
        j/=2
    
    if ( k )
    
        printf( "%0o%0o ", s, k )
    
    print
'  

测试用:

touch blah
chmod 7444 blah

将导致:

7444 -r-Sr-Sr-T 1 cheko cheko   0 2009-12-05 01:03 blah

touch blah
chmod 7555 blah

将给予:

7555 -r-sr-sr-t 1 cheko cheko   0 2009-12-05 01:03 blah

【讨论】:

+1 谢谢!我将其缩短为 1 行别名:alias "lsmod=ls -al|awk 'k=0;s=0;for(i=0;i&lt;=8;i++);k+=((substr(\$1,i+2,1)~/[rwxst]/)*2^(8-i));;j=4;for(i=4;i&lt;=10;i+=3);s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;;if(k);printf(\"%0o%0o \",s,k);;print;'" +1 进一步提出了恢复工作文件权限的想法:ysgitdiary.blogspot.fi/2013/04/… 不要使用 lsmod 作为别名。这是用于列出内核模块的已知 posix 命令。 @JeroenWiertPluimers 这给了我来自 awk 的语法错误 @EvanLanglois 所以提出一个新问题。【参考方案6】:

使用它来显示 Unix 数字权限值(八进制值)和文件名。

stat -c '%a %n' *

使用它来显示 Unix 数字权限值(八进制值)和文件夹的 sgid 和粘滞位、所有者的用户名、组名、总大小(以字节为单位)和文件名。

stat -c '%a %A %U %G %s %n' *

如果您需要人工可读格式的最后修改时间,请添加 %y。如需更多选项,请参阅stat。

使用别名的更好版本

使用别名是完成所需任务的更有效方式,它还包括颜色。以下显示您的结果首先按组目录组织,以彩色显示,以人类可读格式(例如,1K 234M 2G)打印尺寸编辑您的~/.bashrc并为您的帐户添加别名或通过编辑/etc/profile.d/custom.sh全局添加别名

键入 cls 会显示您的新 LS 命令结果。

alias cls="ls -lha --color=always -F --group-directories-first |awk 'k=0;s=0;for(i=0;i<=8;i++);k+=((substr(\$1,i+2,1)~/[rwxst]/)*2^(8-i));;j=4;for(i=4;i<=10;i+=3);s+=((substr(\$1,i,1)~/[stST]/)*j);j/=2;;if(k);printf(\"%0o%0o \",s,k);;print;'"

文件夹树

当您编辑 bashrc 或 custom.sh 时,请包含以下别名以查看图形表示,其中键入 lstree 将显示您当前的文件夹树结构

alias lstree="ls -R | grep ":$" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'"

它会显示:

   |-scripts
   |--mod_cache_disk
   |--mod_cache_d
   |---logs
   |-run_win
   |-scripts.tar.gz

【讨论】:

【参考方案7】:

您不使用 ls 来获取文件的权限信息。您使用 stat 命令。它会给你你想要的数值。 “Unix 方式”说您应该使用 ls(或 'echo *')和 stat 以及您喜欢的任何其他方式以您想要的格式提供信息。

【讨论】:

【参考方案8】:

在chosen answer 和suggestion to use an alias 的基础上,我将其转换为函数,以便可以将目录传递给列表。

# ls, with chmod-like permissions and more.
# @param $1 The directory to ls
function lls 
  LLS_PATH=$1

  ls -AHl $LLS_PATH | 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"

【讨论】:

不适用于某些 UNIX:ls: ERROR: Illegal option -- H 然后是 usage: ls -1ACFLRTabcdfgilmnopqrstux -W[sv] [files]awk: cmd. line:2: fatal: file '/usr/include' is a directory【参考方案9】:

考虑到问题指定的是 UNIX,而不是 Linux,因此不需要使用 stat 二进制文件。下面的解决方案适用于非常旧的 UNIX,尽管需要 sh 以外的 shell(即 bash)。它是glenn jackman 的perl stat solution 的派生。为了简洁,这似乎是一个值得探索的替代方案。

$ alias lls='llsfn ()  while test $# -gt 0; do perl -s -e \
  '\''@fields = stat "$f"; printf "%04o\t", $fields[2] & 07777'\'' \
    -- -f=$1; ls -ld $1; shift; done; unset -f llsf; ; llsfn'
$ lls /tmp /etc/resolv.conf
1777    drwxrwxrwt   7 sys      sys       246272 Nov  5 15:10 /tmp
0644    -rw-r--r--   1 bin      bin           74 Sep 20 23:48 /etc/resolv.conf

别名是使用answer中的信息开发的

整个答案是这个answer中解决方案的修改版

【讨论】:

以上是关于Unix list 命令 'ls' 可以输出数字 chmod 权限吗?的主要内容,如果未能解决你的问题,请参考以下文章

格式化 Unix 密码存储 ls 输出

命令行把文件列表输出到一个文件里

unix

UNIX命令

UVA 400 - Unix ls (Unixls命令)

每天学习一个LINUX命令:ls 目录列表(list 清单目录 名单)