OS X10.8.4を実行しているMacにMacPorts経由でcoreutilsをインストールしています。利用可能な場合、ls
[(GNU coreutils) 8.21
]のcoreutilsバージョンを使用するようにls
を設定しています。
if [ -e /opt/local/libexec/gnubin ]; then
alias ls='/opt/local/libexec/gnubin/ls --color=auto'
else
alias ls='/bin/ls -G'
fi
拡張属性(xattrs)を持つことがわかっているファイルがあるディレクトリでls -l
を実行すると、それらのリストのアクセス許可の後に@
記号が表示されると思います。ただし、@
記号は表示されません。 /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が存在するときにls
のcoreutilsバージョンを取得して@
記号を表示するにはどうすればよいですか?
Mark Cohenのコメントは正しいと思います。この機能は、coreutilsバージョンのls
にはないようです。 coreutils ls
を使用する正当な理由が実際にはなかったため、組み込みのBSDバージョンに切り替えました。
Coreutilslsに拡張属性を追加できます。これは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
呼び出し)を出力するロジックを見つけ、coreutils ls
がアクセス許可の後にシンボルを配置する場所にフックしました。 。 3つの変更は次のとおりです。
xattr.h
を含むany_has_acl
を設定します。これは、拡張属性を持たないリストの、並べる権限の後にスペースを挿入するために必要です。listxattr
を呼び出し、条件付きで@
シンボルを設定して、実際のチェックを行います。拡張属性とACLの両方がある場合、これが記述されている方法では@
のみが表示されることに注意してください。XATTR_NOFOLLOW
引数は、listxattr
にシンボリックリンクをたどらないように指示します。その引数はOSX ls
で使用されます。