![Linux:一种简单而优雅的方式来查找具有 acl 设置的所有文件?](https://linux22.com/image/192270/Linux%EF%BC%9A%E4%B8%80%E7%A7%8D%E7%AE%80%E5%8D%95%E8%80%8C%E4%BC%98%E9%9B%85%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9D%A5%E6%9F%A5%E6%89%BE%E5%85%B7%E6%9C%89%20acl%20%E8%AE%BE%E7%BD%AE%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我想找到所有设置了 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)