
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
が、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
ファイルのリストに対して何かを行うには、ここでは'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)