我想找到所有设置了 acl 的文件。我知道这个肮脏的解决方案:查找目录中设置了 acl 的所有文件。 /ETC
sudo ls -lhR /etc|grep +
有人知道更优雅的解决方案吗?
答案1
简单和优雅是一个相当高的门槛,如果你的解决+
方案中有文件名(比如 c++),你的肮脏解决方案就会失败。
另一种方法是getfacl
递归使用,跳过没有 ACL 的文件
getfacl -Rs /your/dir | grep "# file:"
这将列出它们,并且 grep 仅保留文件名。
答案2
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)