【发布时间】:2010-12-20 05:44:45
【问题描述】:
列出目录时是否可以查看数字unix权限例如644而不是符号输出-rw-rw-r--
谢谢。
【问题讨论】:
标签: unix command-line permissions
列出目录时是否可以查看数字unix权限例如644而不是符号输出-rw-rw-r--
谢谢。
【问题讨论】:
标签: unix command-line permissions
几乎可以..
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}'
【讨论】:
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}'"
chmod 777 dir 之后,您的命令将权限打印为767
假设您知道要查找哪些文件,我能想到的最接近的(保持足够简单)是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
【讨论】:
stat -f '%A %N' * 在 mac (FreeBSD) 上做同样的事情
stat 不是 ls 因此这不是正确的答案。但是,我相信这是在所需输出的上下文中的正确答案。如果在管道中允许awk,则在-exec 中调用stat 时应允许find;那么你可以不用*直接使用stat
stat -c '%a %n' * **/*。
man stat -c or --format:%a access rights in octal (note '#' and '0' printf flags), %n file
你可以只使用 GNU find。
find . -printf "%m:%f\n"
【讨论】:
-maxdepth 1选项,否则会遍历整个目录树。
您可以使用以下命令
stat -c "%a %n" *
您也可以使用任何filename 或directoryname 代替* 来获得特定结果。
在 Mac 上,您可以使用
stat -f '%A %N' *
【讨论】:
stat: illegal option -- cusage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
man stat 中提供的信息,那么命令应该是stat -f "%Lp %N" *。 %Lp 似乎打印与 %A 相同的内容。
@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
【讨论】:
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;}'"
使用它来显示 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
【讨论】:
您不使用 ls 来获取文件的权限信息。您使用 stat 命令。它会给你你想要的数值。 “Unix 方式”说您应该使用 ls(或 'echo *')和 stat 以及您喜欢的任何其他方式以您想要的格式提供信息。
【讨论】:
在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}"
}
【讨论】:
ls: ERROR: Illegal option -- H 然后是 usage: ls -1ACFLRTabcdfgilmnopqrstux -W[sv] [files] 和 awk: cmd. line:2: fatal: file '/usr/include' is a directory
考虑到问题指定的是 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中解决方案的修改版
【讨论】: