
Quero encontrar todos os arquivos com o conjunto acl. Eu conheço esta solução suja: para encontrar todos os arquivos com acl definido no diretório. /etc
sudo ls -lhR /etc|grep +
Alguém conhece uma solução mais elegante?
Responder1
Fácil e elegante é um nível bastante alto de alcançar e sua solução suja falhará se você tiver nomes de arquivos +
(digamos, c++).
A alternativa é usar getfacl
recursivamente, ignorando arquivos que não possuem ACL
getfacl -Rs /your/dir | grep "# file:"
Isso irá listá-los e o grep mantém apenas os nomes dos arquivos.
Responder2
Comsfind
ou o find
embutido dobosh
concha, é apenas:
sfind . -acl
bosh -c 'find . -acl'
-acl The primary evaluates as true if the file has addi- tional ACLs defined. On platforms that do not support ACLs or where sfind does not yet support ACLs, the pri- mary always evaluates as false. Currently only Solaris, Linux and FreeBSD is supported.
Ambos sfind
e bosh
são enviados como parte deFerramentas Schily.
Para obter algo semelhante com ogetfacl
comando normalmente encontrado em sistemas GNU, construindoA resposta de Eduardo, precisaríamos decodificar o campo do arquivo (onde getfacl
codifica alguns valores de bytes com \ooo
representações e \
as \\
) com algo como:
getfacl -Rs . | perl -nle '
if (/^# file: (.*)/) {
print $1 =~ s{\\(\\|[0-7]{3})}{
$1 eq "\\" ? "\\" : chr oct $1}ger
}'
Para fazer algo com essa lista de arquivos, como não podemos usar find
aqui -exec
, você desejaria imprimir a lista delimitada por NUL:
getfacl -Rs . | perl -nl0e '
if (/^# file: (.*)/) {
print $1 =~ s{\\(\\|[0-7]{3})}{
$1 eq "\\" ? "\\" : chr oct $1}ger
}'
Assim, você pode, por exemplo, canalizá-lo xargs -r0 some-command
ou armazená-lo em um array com array=( ${(0)"$(cmd)"} )
(zsh) ou readarray -td '' < <(cmd)
(bash 4.4+).