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 Xのソースコードから@(call)lsを印刷するロジックを見て、それをcoreutilsが権限の後ろにシンボルを置く場所にリンクしました。 3つの変更は次のとおりです。listxattrls

  1. 含むxattr.h
  2. リストに拡張属性があるかどうかを設定しますany_has_acl。これは、拡張属性を持たないリストが配列権限の後にスペースを挿入するために必要です。
  3. listxattr@シンボルを呼び出して条件付きに設定して実際に検証 - 作成された方法は、拡張属性とACLの両方が存在する場合にのみ表示されることに注目する価値があります。@

このパラメータはシンボリックリンクに従わないようにXATTR_NOFOLLOW指示します。このパラメータはOS Xlistxattrで使用されます。ls

おすすめ記事