Linux:一种简单而优雅的方式来查找具有 acl 设置的所有文件?

Linux:一种简单而优雅的方式来查找具有 acl 设置的所有文件?

我想找到所有设置了 acl 的文件。我知道这个肮脏的解决方案:查找目录中设置了 acl 的所有文件。 /ETC

 sudo ls -lhR /etc|grep +

有人知道更优雅的解决方案吗?

答案1

简单和优雅是一个相当高的门槛,如果你的解决+方案中有文件名(比如 c++),你的肮脏解决方案就会失败。

另一种方法是getfacl递归使用,跳过没有 ACL 的文件

getfacl -Rs /your/dir | grep "# file:"

这将列出它们,并且 grep 仅保留文件名。

答案2

sfindfind内置的bosh外壳,它只是:

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.

sfind和均bosh作为希利工具

得到类似的东西getfacl通常在 GNU 系统上找到的命令,建立在爱德华多的回答,我们需要解码文件字段(其中使用表示形式和asgetfacl编码一些字节值),如下所示:\ooo\\\

getfacl -Rs  . | perl -nle '
  if (/^# file: (.*)/) {
    print $1 =~ s{\\(\\|[0-7]{3})}{
      $1 eq "\\" ? "\\" : chr oct $1}ger
  }'

要对该文件列表执行某些操作,因为我们不能在此处使用find's -exec,您需要打印 NUL 分隔的列表:

getfacl -Rs  . | perl -nl0e '
  if (/^# file: (.*)/) {
    print $1 =~ s{\\(\\|[0-7]{3})}{
      $1 eq "\\" ? "\\" : chr oct $1}ger
  }'

因此,您可以使用(zsh)或(bash 4.4+)将其xargs -r0 some-command通过管道传输或存储在数组中。array=( ${(0)"$(cmd)"} )readarray -td '' < <(cmd)

相关内容