Acredito que o comentário de Mark Cohen esteja correto: essa funcionalidade parece estar ausente da versão coreutils de ls
. Na verdade, não tenho um bom motivo para usar o coreutils ls
, então voltei para a versão integrada do BSD.
Eu tenho o coreutils instalado via MacPorts no meu Mac executando o OS X 10.8.4. Eu tenho ls
definido para usar a versão coreutils de ls
[ (GNU coreutils) 8.21
] quando disponível:
if [ -e /opt/local/libexec/gnubin ]; then
alias ls='/opt/local/libexec/gnubin/ls --color=auto'
else
alias ls='/bin/ls -G'
fi
Quando executo ls -l
em um diretório com arquivos que possuem atributos estendidos (xattrs), espero ver um sinal @
após as permissões nessas listagens. No entanto, não vejo sinal @
. Se eu executar /bin/ls -l
, obtenho o sinal @
.
Listagem de arquivos de /bin/ls -l
:
-rw-r--r--@ 1 zev.eisenberg staff 132887 Jul 19 16:24 flowchart.graffle
Listagem de arquivos de ls -l
(usando coreutils):
-rw-r--r-- 1 zev.eisenberg staff 132887 Jul 19 16:24 flowchart.graffle
Como posso obter a versão coreutils de ls
para mostrar o sinal @
quando os xattrs estão presentes?
Você pode adicionar atributos estendidos ao coreutils ls. Isto é baseado em 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] = '***************
*** 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] = '%pre%';
+ else if (listxattr(f->name, NULL, 0, XATTR_NOFOLLOW) > 0)
+ modebuf[10] = '@';
else if (f->acl_type == ACL_T_SELINUX_ONLY)
modebuf[10] = '.';
';
+ else if (listxattr(f->name, NULL, 0, XATTR_NOFOLLOW) > 0)
+ modebuf[10] = '@';
else if (f->acl_type == ACL_T_SELINUX_ONLY)
modebuf[10] = '.';
Basicamente eu olhei no OS X ls
source para encontrar a lógica para imprimir o @ (o listxattr
call) e enganchei isso em onde o coreutils ls
coloca um símbolo após as permissões. As três mudanças são:
xattr.h
any_has_acl
se qualquer uma das listagens tiver atributos estendidos - isso é necessário para que as listagens que não tiverem atributos estendidos tenham um espaço inserido após as permissões para alinhar as coisas listxattr
e definindo condicionalmente o símbolo @
- pode ser interessante notar que a maneira como isso é escrito mostrará apenas o @
se houver atributos estendidos e ACL O argumento XATTR_NOFOLLOW
informa listxattr
para não seguir links simbólicos. Esse argumento é usado no OS X ls
.