
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 getfacl
die 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
Mitsfind
oder die find
eingebautebosh
Shell, 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 sfind
werden bosh
geliefert als Teil vonSchily-Werkzeuge.
Um etwas Ähnliches zu bekommen mit demgetfacl
Befehl, der typischerweise auf GNU-Systemen zu finden ist, auf etwas aufbauenEduardos Antwort, wir müssten das Dateifeld (wo getfacl
einige Bytewerte mit \ooo
Darstellungen 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-command
an ein Array weiterleiten oder darin speichern .array=( ${(0)"$(cmd)"} )
readarray -td '' < <(cmd)