Linux: простой и элегантный способ найти все файлы с установленным acl?

Linux: простой и элегантный способ найти все файлы с установленным acl?

Я хочу найти все файлы с установленным acl. Я знаю это грязное решение: для поиска всех файлов с установленным acl в каталоге /etc

 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и boshпоставляются как частьSchily-Инструменты.

Чтобы получить что-то подобное сgetfaclкоманда, обычно встречающаяся в системах GNU, наращивая наОтвет Эдуардо, нам нужно будет декодировать поле файла (где getfaclкодирует некоторые байтовые значения с \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
  }'

Таким образом, вы можете, например, передать его по конвейеру xargs -r0 some-commandили сохранить в массиве с помощью array=( ${(0)"$(cmd)"} )(zsh) или readarray -td '' < <(cmd)(bash 4.4+).

Связанный контент