在列出目录时,是否可以查看数字unix权限,如644,而不是符号输出-rw-rw-r——
谢谢。
它几乎可以。
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}'
你可以使用GNU find。
find . -printf "%m:%f\n"
我能想到的最接近的(保持它足够简单)是stat,假设你知道你在寻找哪些文件。如果你不这样做,*可以找到大部分:
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
@The MYYN
哇,漂亮的awk!但是suid, sgid和sticky bit呢?
你必须用s和t扩展你的过滤器,否则它们就不算数,你会得到错误的结果。要计算这个特殊标志的八进制数,程序是相同的,但是索引是4 7和10。有执行位设置的文件可能的标志是---s--s--t,没有执行位设置的文件可能的标志是---S--S--T
---s--s--t
---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
您不使用ls来获取文件的权限信息。使用stat命令。它会给你你想要的数值。“Unix方式”说的是,你应该使用ls(或'echo *')、stat和其他任何你喜欢的东西来创建你自己的脚本,以你想要的格式提供信息。
在选择答案和建议使用别名的基础上,我将其转换为一个函数,以便将目录传递给list。
# 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}" }
可以使用以下命令
stat -c "%a %n" *
也可以使用任意filename或directoryname来代替*来获得特定的结果。
filename
directoryname
在Mac上,你可以使用
stat -f '%A %N' *
使用此命令显示Unix数字权限值(八进制值)和文件名。
stat -c '%a %n' *
使用此命令显示Unix数字权限值(八进制值)和文件夹的sgid和sticky位、所有者的用户名、组名、以字节为单位的总大小和文件名。
stat -c '%a %A %U %G %s %n' *
如果需要以人类可读格式修改最后一次修改的时间,则添加%y。更多选项见统计。
%y
使用别名的更好版本
使用别名是一种更有效的方式来完成你所需要的,它还包括颜色。下面将显示您的结果,首先按组目录组织,以彩色显示,以人类可读的格式打印大小(例如,1K 234M 2G)编辑您的~/.bashrc并为您的帐户添加别名或通过编辑/etc/profile.d/custom.sh全局
~/.bashrc
/etc/profile.d/custom.sh
输入cls将显示新的LS命令结果。
cls
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将显示当前文件夹树结构
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
考虑到这个问题指定的是UNIX,而不是Linux,因此没有必要使用stat二进制文件。下面的解决方案可以在非常旧的UNIX上工作,尽管需要sh(即bash)以外的shell。它是格伦•杰克曼的perl stat 解决方案的派生。这似乎是一种值得探索的简洁的选择。
sh
bash
perl
$ 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
别名是使用回答中的信息开发的
整个答案是这个回答中的一个解决方案的修改版本
在阅读了这里的许多答案后,按照评论中提供的链接回到了最初的UNIX方法,在想要结合这里提供的内容以及我已经学到的技巧和技巧的同时,我提出了一个新的解决方案。
首先,我曾经使用这个别名,给我列标题:
alias l='echo "Dir Size|Perms|Link Count|Owner|Group|Size|Mod. Time|Name"; ls -haFl --time-style=long-iso --color=always --group-directories-first --format=long'
将此与AWK结合后,我首先了解到我必须更改AWK命令,当使用"- "选项ls,因为这会显示第一列的大小,然后需要读取和解析第二列数据(不再是第一列)。
我发现的问题是,当你提供输入"l“;例如,你在一条路径上,然后输入:l,没问题,但是如果你输入"l"那么目录名呢?如果要列出子目录中的所有内容,该怎么办?这是不可能发生的,因为别名不处理输入。我可以用一个函数来处理这个。然后AWk崩溃了,我可以用一个子别名来处理。
两者的结合非常完美。
添加到我的。bashrc文件
function _bestLS() { echo 'MODE|Dir Size|Perms|Link Count|Owner|Group|Size|Mod. Time|Name'; if [ "$*" == '' ]; then alias _awk4ls="awk '{k=0;s=0;for(i=0;i<=8;i++){;k+=((substr(\$2,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;}'"; output=`ls -shaFl --time-style=long-iso --color=always -F --group-directories-first --format=long | _awk4ls`; else output=`ls -shaFl --time-style=long-iso --color=always -F --group-directories-first --format=long $* | _awk4ls`; fi echo "$output" } alias l="_bestLS"
观察(请注意,这是一个小写字母L,而不是数字1,在这个网站的字体看起来是一样的):
>>l
>>l [SOME DIRECTORY]
附注:请原谅我很长的(3行)提示(PS1)