Shell

在 Mac 上使用 coreutils ls 查看擴展屬性

  • September 7, 2019

我在執行 OS X 10.8.4 的 Mac 上通過 MacPorts 安裝了 coreutils。如果可用,我已ls設置使用ls[ (GNU coreutils) 8.21] 的 coreutils 版本:

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來向我顯示標誌?@

我相信 Mark Cohen 的評論是正確的:coreutils 版本的ls. 我實際上沒有充分的理由使用 coreutils ls,所以我切換回了內置的 BSD 版本。

您可以將擴展屬性添加到 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

引用自:https://unix.stackexchange.com/questions/86463