在查看我的系统上的man
页面ls
并搜索 Google 后,我看到了awk
是一种使用或perl
显示八进制权限的方法当使用 时ls
,但是bash
还有什么更原生的吗?
ls -alh 的标准输出
$ ll
total 0
drwxr-xr-x 5 user group 170B May 20 20:03 .
drwxr-xr-x 17 user group 578B May 20 20:03 ..
-rw-r--r-- 1 user group 0B May 20 20:03 example
-rw-r--r-- 1 user group 0B May 20 20:03 example-1
-rw-r--r-- 1 user group 0B May 20 20:03 example-3
所需的输出,包括权限的八进制表示
$ ll
total 0
drwxr-xr-x 1775 5 user group 170B May 20 20:03 .
drwxr-xr-x 1775 17 user group 578B May 20 20:03 ..
-rw-r--r-- 1644 1 user group 0B May 20 20:03 example
-rw-r--r-- 1644 1 user group 0B May 20 20:03 example-1
-rw-r--r-- 1644 1 user group 0B May 20 20:03 example-3
(免责声明:不确定这些八进制是否是确切地正确的)
推理
我更熟悉drwxr-xr-x
权限的符号,但有时当破折号落在奇怪的地方时,我可能会一眼看错。我也想看看八进制的等价物。
转换能力(问题第2部分)
我认为很久以前八进制权限可能仅限于000
-777
但最近有一些类似set-group-ID
和sticky
的东西给了我们带有 4 个位置的八进制,例如1775
.是否可以用八进制格式表示所有可能的权限?如果不是,那么我最好理解为什么 bash 的ls
命令似乎没有这种格式。
答案1
您可以使用该stat
命令并大致获得您想要的内容:
$ stat -c '%A %a %h %U %G %s %y %n' *
drwxrwxr-x 775 2 saml saml 4096 2013-05-16 22:02:13.230463837 -0400 alsa
drwxrwxr-x 775 31 saml saml 4096 2013-03-26 12:09:20.707827127 -0400 apps
-rw-rw-r-- 664 1 saml saml 43627 2013-05-18 12:28:32.157583577 -0400 autosave.h2song
-rw-rw-r-- 664 1 saml saml 3283 2013-05-18 02:49:41.565154101 -0400 bbbb
drwxrwxr-x 775 4 saml saml 4096 2013-05-03 06:56:50.087842384 -0400 bin
-rw-rw-r-- 664 1 saml saml 4403 2013-05-18 19:20:05.819681196 -0400 blahblah
如果您需要的话,这是清理后的版本:
$ stat -c '%A %a %h %U %G %s %y %n' *| sed 's/\.[[:digit:]]\+[ ]\+-[[:digit:]]\+/ /'
drwxrwxr-x 775 2 saml saml 4096 2013-05-16 22:02:13 alsa
drwxrwxr-x 775 31 saml saml 4096 2013-03-26 12:09:20 apps
-rw-rw-r-- 664 1 saml saml 43627 2013-05-18 12:28:32 autosave.h2song
-rw-rw-r-- 664 1 saml saml 3283 2013-05-18 02:49:41 bbbb
drwxrwxr-x 775 4 saml saml 4096 2013-05-03 06:56:50 bin
-rw-rw-r-- 664 1 saml saml 4403 2013-05-18 19:20:05 blahblah
查看stat
手册页,了解除上述运算符之外还可以使用的更多格式运算符。
参考
答案2
我也用来stat
获得ls
类似的输出,但我使用不同的方法来格式化输出:我用作TAB
分隔符(如果需要的话,可以更轻松地解析),格式化时间stat
,最后使用numfmt
(包含在 GNUcoreutils
>= 8.21 2013-02-14)以获得合适的文件大小:
stat --printf="%A\t%a\t%h\t%U\t%G\t%s\t%.19y\t%n\n" * | numfmt --to=iec-i --field=6 --delimiter=' ' --suffix=B
请注意,用于的分隔符numfmt
也是 a Tab(在终端中输入 hit Ctrl+ Vthen Tab)。
输出如下所示:
drwxr-xr-x 755 2 don users 4.0KiB 2013-05-17 03:37:02 150905-adwaita-x-dark-light-1.3
drwxr-xr-x 755 8 don users 4.0KiB 2011-10-13 07:30:39 Adwaita Slim
drwxr-xr-x 755 3 don users 4.0KiB 2013-05-17 19:26:41 Away
drwxr-xr-x 755 5 don users 4.0KiB 2013-05-17 03:09:14 elementary
-rw-r--r-- 644 1 don users 539KiB 2013-05-10 00:32:14 gdm.jpg
-rw-r--r-- 644 1 don users 1.5MiB 2013-05-19 04:30:16 gnome-shell-3.8.2.tar.xz
drwxrwxr-x 775 4 don users 4.0KiB 2013-05-18 18:34:38 gnome-themes-standard-3.8.1
-rw-r--r-- 644 1 don users 3.7MiB 2013-05-18 18:30:06 gnome-themes-standard-3.8.1.tar.xz
drwxrwxr-x 775 17 don users 4.0KiB 2013-05-18 18:37:05 gtk+-3.8.2
-rw-r--r-- 644 1 don users 14MiB 2013-05-18 18:30:56 gtk+-3.8.2.tar.xz
drwxr-xr-x 755 13 don users 4.0KiB 2013-05-18 02:41:51 MediterraneanNight-2.02
-rw-r--r-- 644 1 don users 603B 2013-05-19 20:07:26 python-pytaglib.tar.gz
-rw-r--r-- 644 1 don users 442KiB 2013-05-19 00:33:27 Stripes.jpg
笔记: 按照西德的评论OSX
,coreutils
命令是gstat
和gnumfmt
。
答案3
此 awk 代码将权限从符号转换为数字。但它只涵盖正常情况(即至少不包括sStT
):
awk '$1 ~ /^[-dsbclp]([-r][-w][-x]){3}[.+]?$/
{for(i=0;i<3;i++) {symbol=substr($1,2+i*3,3); sum=0;
if (substr(symbol,1,1) == "r") sum+=4;
if (substr(symbol,2,1) == "w") sum+=2;
if (substr(symbol,3,1) == "x") sum+=1;
printf "%d",sum;}}'
这会产生您想要的输出:
awk '$1 ~ /^[-dsbclp]([-r][-w][-x]){3}[.+]?$/
{printf "%s ",$1;
for(i=0;i<3;i++) {symbol=substr($1,2+i*3,3); sum=0;
if (substr(symbol,1,1) == "r") sum+=4;
if (substr(symbol,2,1) == "w") sum+=2;
if (substr(symbol,3,1) == "x") sum+=1;
printf "%d",sum;}
$1=""; print}'