
Я хочу найти все файлы с установленным 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+).