Linux: ACL が設定されたすべてのファイルを検索する簡単でエレガントな方法はありますか?

Linux: ACL が設定されたすべてのファイルを検索する簡単でエレガントな方法はありますか?

ACL が設定されているすべてのファイルを検索したいのですが、次のような汚い解決策を知っています: /etc ディレクトリ内の ACL が設定されているすべてのファイルを検索するには

 sudo ls -lhR /etc|grep +

もっとエレガントな解決策を知っている人はいますか?

答え1

簡単かつエレガントというのは、達成するのがかなり難しいハードルであり、ファイル名に「」が含まれている場合+(たとえば、c++)、汚い解決策は失敗します。

代替案としてはgetfacl、ACLを持たないファイルをスキップして再帰的に使用する方法がある。

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

するとそれらがリストされ、grep はファイル名のみを保持します。

答え2

sfindまたはfind組み込みの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が、boshSchilyツール

同様のものを得るにはgetfaclGNUシステムに典型的に見られるコマンド、構築するエドゥアルドの答え、ファイル フィールド ( は表現とgetfaclを持つバイト値を としてエンコードします)を次のようにデコードする必要があります。\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)

関連情報