Linux: eine einfache und elegante Möglichkeit, alle Dateien mit festgelegter ACL zu finden?

Linux: eine einfache und elegante Möglichkeit, alle Dateien mit festgelegter ACL zu finden?

Ich möchte alle Dateien mit gesetzter ACL finden. Ich kenne diese schmutzige Lösung: um alle Dateien mit gesetzter ACL im Verzeichnis /etc zu finden

 sudo ls -lhR /etc|grep +

Kennt jemand eine elegantere Lösung?

Antwort1

„Einfach“ und „elegant“ ist eine ziemlich hohe Messlatte und Ihre schmutzige Lösung schlägt fehl, wenn sie Dateinamen enthält +(sagen wir C++).

Die Alternative ist getfacldie rekursive Verwendung, wobei Dateien ohne ACL übersprungen werden

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

Dadurch werden sie aufgelistet und das Grep behält nur die Dateinamen.

Antwort2

Mitsfindoder die findeingebauteboshShell, es ist nur:

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.

Beide sfindwerden boshgeliefert als Teil vonSchily-Werkzeuge.

Um etwas Ähnliches zu bekommen mit demgetfaclBefehl, der typischerweise auf GNU-Systemen zu finden ist, auf etwas aufbauenEduardos Antwort, wir müssten das Dateifeld (wo getfacleinige Bytewerte mit \oooDarstellungen und \als kodiert werden \\) mit etwas wie diesem dekodieren:

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

Um etwas mit dieser Dateiliste zu tun, da wir hier keine find's verwenden können -exec, würden Sie die Liste mit NUL-Trennzeichen ausdrucken wollen:

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

Sie können es also beispielsweise mit (zsh) oder (bash 4.4+) xargs -r0 some-commandan ein Array weiterleiten oder darin speichern .array=( ${(0)"$(cmd)"} )readarray -td '' < <(cmd)

verwandte Informationen