在 Mac 上使用 coreutils ls 查看扩展属性

在 Mac 上使用 coreutils ls 查看扩展属性

我在运行 OS X 10.8.4 的 Mac 上通过 MacPorts 安装了 coreutils。我已设置使用[ ]ls的 coreutils 版本(如果可用):ls(GNU coreutils) 8.21

if [ -e /opt/local/libexec/gnubin ]; then
    alias ls='/opt/local/libexec/gnubin/ls --color=auto'
else
    alias ls='/bin/ls -G'
fi

当我ls -l在包含已知具有扩展属性 (xattrs) 的文件的目录中运行时,我希望@在这些列表中的权限后面看到一个标志。然而,我没有看到任何@迹象。如果我跑步/bin/ls -l,我就会得到@标志。

文件列表来自/bin/ls -l

-rw-r--r--@  1 zev.eisenberg  staff  132887 Jul 19 16:24 flowchart.graffle

文件列表ls -l(使用 coreutils):

-rw-r--r--  1 zev.eisenberg staff 132887 Jul 19 16:24 flowchart.graffle

当 xattrs 存在时,如何获取 coreutils 版本以向ls我显示标志?@

答案1

您可以向 coreutils ls 添加扩展属性。这是基于 coreutils-8.22 的:

***************
*** 59,62 ****
--- 59,64 ----
  #include <wchar.h>

+ #include <sys/xattr.h>
+
  #if HAVE_LANGINFO_CODESET
  # include <langinfo.h>
***************
*** 3056,3059 ****
--- 3058,3062 ----
                              : ACL_T_YES));
            any_has_acl |= f->acl_type != ACL_T_NONE;
+           any_has_acl |= listxattr(f->name, NULL, 0, XATTR_NOFOLLOW);

            if (err)
***************
*** 3811,3814 ****
--- 3814,3819 ----
    if (! any_has_acl)
      modebuf[10] = '\0';
+   else if (listxattr(f->name, NULL, 0, XATTR_NOFOLLOW) > 0)
+     modebuf[10] = '@';
    else if (f->acl_type == ACL_T_SELINUX_ONLY)
      modebuf[10] = '.';

基本上,我在 OS Xls源代码中查找打印 @(调用listxattr)的逻辑,并将其挂接到 coreutilsls在权限后面放置符号的位置。这三个变化是:

  1. 包括xattr.h
  2. 设置any_has_acl是否有任何列表具有扩展属性 - 这是必需的,以便没有扩展属性的列表在排列权限后插入一个空格
  3. listxattr通过调用并有条件地设置符号来进行实际检查- 可能值得注意的是,如果同时存在扩展属性和 ACL,@他们的编写方式将仅显示@

XATTR_NOFOLLOW参数告诉listxattr不要遵循符号链接。 OS X 中使用了该参数ls

答案2

我相信 Mark Cohen 的评论是正确的:coreutils 版本中似乎缺少此功能ls。我实际上没有充分的理由使用 coreutils ls,所以我切换回内置的 BSD 版本。

相关内容