【问题标题】: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--

谢谢。

【问题讨论】:

    标签: unix command-line permissions


    【解决方案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 answersuggestion 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 jackmanperl 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中解决方案的修改版

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-07-07
          • 1970-01-01
          • 2018-02-28
          • 1970-01-01
          • 1970-01-01
          • 2014-11-15
          • 1970-01-01
          相关资源
          最近更新 更多