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

时间:2009-11-25 10:21:35

标签: unix command-line permissions

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

感谢。

11 个答案:

答案 0 :(得分:311)

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

stat -c '%a %n' *

enter image description here

有关更多选项,请参阅stat

要使用别名更有效地执行此操作,请参阅下面的评论。

答案 1 :(得分:138)

最近我能想到的(保持足够简单)是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

答案 2 :(得分:55)

你可以使用GNU find。

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

答案 3 :(得分:28)

您可以使用以下命令

stat -c "%a %n" *

此外,您可以使用任意filenamedirectoryname代替*来获取特定结果。

在Mac上,您可以使用

stat -f '%A %N' *

答案 4 :(得分:16)

@The MYYN

哇,好awk!但是suid,sgid和sticky bit怎么样?

您必须使用s和t扩展过滤器,否则它们将无法计数并且您得到错误的结果。要计算此特殊标志的八进制数,过程是相同的,但索引位于4 7和10.对于没有设置执行位的文件,执行位设置的文件的可能标志为---s--s--t amd { {1}}

---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

答案 5 :(得分:4)

您不能使用ls来获取文件的权限信息。您使用stat命令。它会为您提供所需的数值。 &#34; Unix方式&#34;说你应该使用ls(或者&#39; echo *&#39;)和stat以及你喜欢的其他任何你想要的格式来创建你自己的脚本。

答案 6 :(得分:3)

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

stat -c '%a %n' *

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

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

enter image description here

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

使用别名的更好版本

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

键入 /etc/profile.d/custom.sh 会显示您的新LS命令结果。

cls

Alias is the most efficient solution

文件夹树

在您编辑bashrc或custom.sh时,请使用以下别名来查看图形表示,其中输入 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;}'" 将显示您当前的文件夹树结构

lstree

会显示:

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

答案 7 :(得分:2)

不,它只能打印数字uid / gids。

答案 8 :(得分:0)

建立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}"
}

答案 9 :(得分:0)

tl; dr:这个问题的快速答案是,没有ls无法打印数字权限,请使用 stat

使用awk时,扩展的权限将在翻译中丢失。

例如:

$ ls -la /usr/local/src/
total 8
drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

建议的解决方案将打印以下内容:

$ ls -la /usr/local/src | awk '{>
total 8
765 drwxrwsr-x  2 root staff 4096 Oct 23 11:18 .
765 drwxrwsr-x 10 root staff 4096 Oct 23 11:18 ..

完全错误。

另一方面,

统计信息正确无误:

$ stat / usr / local / src       文件:/ usr / local / src       大小:4096块:8 IO块:4096目录     设备:801h / 2049d索引节点:917803链接:2     访问:(2775 / drwxrwsr-x)Uid:(0 / root)Gid:(50 / staff)     访问时间:2018-10-24 12:30:58.197907324 +0900     修改:2018-10-23 11:18:59.810677000 +0900     变更:2018-10-23 11:18:59.810677000 +0900      出生:-

人际统计的奖金:

$ stat -c %a /usr/local/src
2775

这已经在Debian稳定版上进行了测试。

答案 10 :(得分:0)

考虑到该问题指定的是UNIX,而不是Linux,因此不需要使用stat二进制文件。以下解决方案可在非常老的UNIX上运行,尽管需要sh(即bash)以外的shell。它是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

中解决方案的修改版本