Shell
在 Mac 上使用 coreutils ls 查看擴展屬性
我在執行 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
. 我實際上沒有充分的理由使用 coreutilsls
,所以我切換回了內置的 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 X
ls
原始碼以找到列印 @(listxattr
呼叫)的邏輯,並將其連接到 coreutilsls
在權限後放置符號的位置。這三個變化是:
- 包含
xattr.h
- 設置
any_has_acl
是否有任何列表具有擴展屬性 - 這是必需的,以便沒有擴展屬性的列表在排列權限之後插入一個空格- 通過呼叫
listxattr
並有條件地設置@
符號來進行實際檢查 - 可能值得注意的是,它們的編寫方式將僅顯示@
是否同時存在擴展屬性和 ACL該
XATTR_NOFOLLOW
論點告訴listxattr
不要遵循符號連結。該參數在 OS X 中使用ls
。