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<=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" *
您也可以使用任何filename
或directoryname
代替*
来获得特定结果。
在 Mac 上,您可以使用
stat -f '%A %N' *
【讨论】:
对我不起作用。stat: illegal option -- c
usage: 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<=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;'"
+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 权限吗?的主要内容,如果未能解决你的问题,请参考以下文章