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가 권한 뒤에 기호를 넣는 위치에 연결했습니다. 세 가지 변경 사항은 다음과 같습니다.listxattrls

  1. 포함하다xattr.h
  2. 목록에 확장 속성이 있는지 여부를 설정합니다 any_has_acl. 이는 확장 속성이 없는 목록이 배열 권한 뒤에 공백을 삽입하는 데 필요합니다.
  3. listxattr@기호를 호출하고 조건부로 설정하여 실제 확인 - 작성된 방식은 확장된 속성과 ACL이 모두 존재하는 경우에만 표시된다는 점에 주목할 가치가 있을 것입니다.@

이 매개변수는 심볼릭 링크를 따르지 않도록 XATTR_NOFOLLOW지시합니다 . 이 매개변수는 OS X listxattr에서 사용됩니다.ls

답변2

저는 Mark Cohen의 의견이 정확하다고 생각합니다. 이 기능은 coreutils 버전에는 없는 것 같습니다 ls. 실제로 coreutils를 사용할 이유가 없었기 ls때문에 내장 BSD 버전으로 다시 전환했습니다.

관련 정보