Acl

Linux:使用 acl 集查找所有文件的簡單而優雅的方法?

  • June 19, 2021

我想找到所有帶有 acl 集的文件。我知道這個骯髒的解決方案:查找所有在 dir 中設置了 acl 的文件。/ETC

sudo ls -lhR /etc|grep +

有人知道更優雅的解決方案嗎?

簡單而優雅是一個很高的標準,如果你有文件名+(比如 c++),你的骯髒解決方案就會失敗。

另一種方法是getfacl遞歸使用,跳過沒有 ACL 的文件

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

這將列出它們,而 grep 只保留文件名。

使用sfindfind內置boshshell,它只是:

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.

兩者sfindbosh作為Schily-Tools的一部分提供。

getfacl為了獲得與GNU 系統上常見的命令類似的東西,建立在Eduardo 的答案之上,我們需要解碼文件欄位(其中用表示和asgetfacl編碼一些字節值),如下所示:\ooo``\``\\

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

要處理該文件列表,因為我們不能在此處使用find-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)

引用自:https://unix.stackexchange.com/questions/654845