是否可以在列出目录时查看数字unix权限,例如644而不是符号输出-rw-rw-r -
感谢。
答案 0 :(得分:311)
答案 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" *
此外,您可以使用任意filename
或directoryname
代替*
来获取特定结果。
在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' *
如果您需要以人类可读格式进行最后修改的时间,请添加%y
。有关更多选项,请参阅stat。
使用别名的更好版本
使用别名是一种更有效的方法来完成您的需要,它还包括颜色。以下显示按组目录组织的结果,以彩色显示,以人类可读格式打印尺寸(例如,1K 234M 2G)编辑~/.bashrc
并为您的帐户添加别名或通过编辑{{1}全局添加别名}
键入 /etc/profile.d/custom.sh
会显示您的新LS命令结果。
cls
文件夹树
在您编辑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 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}"
}
答案 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 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
中解决方案的修改版本