web-dev-qa-db-ja.com

Macのcoreutilslsで拡張属性を参照してください

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のc​​oreutilsバージョンを取得して@記号を表示するにはどうすればよいですか?

4
Zev Eisenberg

Mark Cohenのコメントは正しいと思います。この機能は、coreutilsバージョンのlsにはないようです。 coreutils lsを使用する正当な理由が実際にはなかったため、組み込みのBSDバージョンに切り替えました。

1
Zev Eisenberg

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つの変更は次のとおりです。

  1. xattr.hを含む
  2. いずれかのリストに拡張属性がある場合は、any_has_aclを設定します。これは、拡張属性を持たないリストの、並べる権限の後にスペースを挿入するために必要です。
  3. listxattrを呼び出し、条件付きで@シンボルを設定して、実際のチェックを行います。拡張属性とACLの両方がある場合、これが記述されている方法では@のみが表示されることに注意してください。

XATTR_NOFOLLOW引数は、listxattrにシンボリックリンクをたどらないように指示します。その引数はOSX lsで使用されます。

2
wilywampa