考虑这个 ls -l 命令的输出:
$ ls -l /usr/bin | tail
-rwxr-xr-x 1 root root 105696 Oct 25 2014 zenity
-rwxr-xr-x 1 root root 188296 Oct 21 2013 zip
-rwxr-xr-x 1 root root 86096 Oct 21 2013 zipcloak
-rwxr-xr-x 1 root root 48459 Mar 3 2015 zipdetails
-rwxr-xr-x 1 root root 2953 Oct 29 10:45 zipgrep
-rwxr-xr-x 2 root root 166584 Oct 29 10:45 zipinfo
权限以清晰易读的字符列出。有没有办法输出ls
与这些权限等价的数字?
答案1
ls
没有这样的标志,但stat
命令允许显示八进制权限。考虑测试文件的示例输出,
testdir:$ stat TESTER
File: ‘TESTER’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 801h/2049d Inode: 1197 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/ xieerqi) Gid: ( 1000/ xieerqi)
Access: 2015-11-05 17:42:01.914917433 -0700
Modify: 2015-11-05 17:42:01.914917433 -0700
Change: 2015-11-05 18:41:04.463776180 -0700
Birth: -
stat
还有--format
标志,可以让你“模拟” ls -l
:
testdir:$ stat --format="%a %h %U %G %s %y %n" * | head -n 3
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.918917452 -0700 Aaaaaaa.bbb - 0000003 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.922917471 -0700 Aaaaaaa.bbb - 0000004 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42:01.930917509 -0700 Aaaaaaa.bbb - 0000005 tag tag_tag 9tag
这里唯一的限制是不能改变时间格式并且不能添加颜色输出。
你可以将该命令别名为.bashrc
一些更短的命令,例如alias lsl2='stat --format="%a %h %U %G %s %y %n" *'
另外,我整理了一个使用find
和awk
实现更好格式的小函数
function lsl2
{
find . -maxdepth 1 | sort | xargs -I{} stat --format="%a %h %U %G %s %y %n" {} | awk '{$7=substr($7,1,5);$8 =" ";print}'
}
示例输出
testdir:$ lsl2 | head -n 7
775 3 xieerqi xieerqi 4096 2015-11-05 22:20 .
664 1 xieerqi xieerqi 0 2015-11-05 17:42 ./Aaaaaaa.bbb - 0000003 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42 ./Aaaaaaa.bbb - 0000004 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42 ./Aaaaaaa.bbb - 0000005 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42 ./Aaaaaaa.bbb - 0000006 tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42 ./Aaaaaaa.bbb - 0000006 tag tag_tag 9tag
664 1 xieerqi xieerqi 0 2015-11-05 17:42 ./Aaaaaaa.bbb - 0000007 tag 9tag
testdir:$ type lsl2
lsl2 is a function
答案2
然而,对这个问题的回答提出了一种“几乎”实现这一目标的方法:
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}'
您可以将其设为别名以便于使用 - 但 ls 本身无法做到这一点。
答案3
这是一个有趣的管道
paste <(printf "%04d\n" $(stat -c '%a' *)) <(ls -l | sed 1d) |
sed -r 's/([[:digit:]]+)\t(.)........./\2\1/'
printf "%04d\n" $(stat -c '%a' *)
-- 打印每个文件的零填充八进制访问权限ls -l | sed 1d
-- 长列表,减去第一行“总计 12345”paste <(...) <(...)
-- 从每个进程替换中取出一行,并用制表符将它们连接起来sed -r 's/([[:digit:]]+)\t(.)........./\2\1/'
--rwxrwxrwx
用八进制值替换人类可读的权限。
答案4
嗯...发现这是在寻找完全不同的东西,
再来收藏一个:
ls -lh \ | sed -re ‘s/rwx/7/g’ \ -e 's/rw-/6/g' \ -e 's/rx/5/g' \ -e 's/r--/4/g' \ -e 's/-wx/3/g' \ -e 's/-w-/2/g' \ -e 's/--x/1/g' \ -e 's/---/0/g'