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


Answers:


339

几乎可以..

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

31
alias cls="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}'"
要将

6
我从angerous89复制并粘贴了该行,发现奇怪的是,输出以每行%0..o开头,而不是755。如果遇到任何其他情况,原因似乎是0和o之间的隐藏字符。一旦删除,命令设置就很好。干杯!
Donna

我认为存在计算问题。在chmod 777 dir您的命令将权限打印为767
Julian F. Weinert之后,2014年

正如唐娜(Donna)所提到的,0和o之间有一个有趣的字符(或2),也很奇怪,好像SO正在添加它……
nbsp

3
这不能识别t和s位。您应该使用“ stat”命令来获取文件许可权信息。手工计算会导致错误!
Evan Langlois,2015年

148

stat假设您知道要查找的文件,我能想到的就是(保持简单)。如果不这样做,*可以找到其中的大多数:

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

它开箱即用地处理粘性,suid和company:

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

20
这在Linux下很好用,我发现stat -f '%A %N' *在Mac(FreeBSD)上做同样的事情
reevesy 2014年

2
我猜这stat是不是ls这样的说法,所以这不是正确的答案。但是,我相信这是期望输出的正确答案。如果awk允许在管道中,find则应允许在何处stat调用-exec;那么您可以stat直接使用而无需使用*
javafueled

2
更短的时间要好得多,并且可以在任何系统上100%正常工作
Kangarooo

如果要使用stat递归查看权限,请在bash下使用stat -c '%a %n' * **/*
丹尼斯·谢瓦利尔


36

您可以使用以下命令

stat -c "%a %n" *

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

在Mac上,您可以使用

stat -f '%A %N' *

1
没为我工作。stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
rschwieb

1
在Ubuntu 14.04的作品。要永远要记住这一点,我已经添加了一个别名在我的.bashrc:别名XXX =“统计-c‘%A%N’*”
faeb187

1
有帮助!您如何找出%A甚至没有出现在Mac上的统计人员中?
igonejack '18年

1
它实际上是一个FreeBSD命令,而Mac恰好是在将其用作高级内核的基础上构建的。
Mohd Abdul Mujib

如果我们仅使用man statmacOS 10.14.4中提供的信息,则命令应为stat -f "%Lp %N" *%Lp似乎打印与相同的东西%A
塞萨尔·安德鲁

17

@MYYN

哇,真好!但是suid,sgid和粘性位又如何呢?

您必须使用s和t扩展您的过滤器,否则它们将不计数并且您将得到错误的结果。要计算此特殊标志的八进制数,过程相同,但索引位于4 7和10。对于设置了执行位的文件,可能的标志是---s--s--tamd;对于没有设置执行位的文件,其可能标志是---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

3
+1谢谢!我将其缩写为1行别名:alias "lsmod=ls -al|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;}'"
Jeroen Wiert Pluimers

+1进一步推动了恢复工作文件权限的想法: ysgitdiary.blogspot.fi/2013/04/…–
Yordan Georgiev

5
不要将lsmod用作别名。.这是列出内核mod的已知posix命令。
shadowbq 2014年

@JeroenWiertPluimers这是awk给我的语法错误
Evan Langlois,

@EvanLanglois,所以问一个新问题。
Jeroen Wiert Pluimers,2015年

9

使用它来显示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

4

您不使用ls来获取文件的许可信息。您使用stat命令。它将为您提供所需的数值。“ Unix方式”说,您应该使用ls(或“ echo *”)和stat以及任何您想以所需格式提供信息的方式发明自己的脚本。


1

基于所选答案使用别名建议,我将其转换为函数,以便可以将目录传递给列表。

# 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}"
}
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.