Solarisで検索からすべての「許可を拒否」メッセージを除外する方法

Solarisで検索からすべての「許可を拒否」メッセージを除外する方法

こんにちは、このトピックに関する以前の質問にはLinuxへの回答が含まれていますが、Solaris 10には含まれていません。

find . ! -readable -prune

-readがPOSIXではないため、Solarisでは機能しません。

Solarisでの検索からすべての「許可拒否」メッセージを除外するPOSIX互換コマンドは何ですか?

正解:jlliagreとrandom832が正解を与えました。

答え1

これは、次の方法で読み取れないディレクトリを削除するPOSIXメソッドですfind

find . \( -exec sh -c ' if [ ! -r "$1" ] ; then { exit 1 ; } ; else for i in "$1"/* ; do if [ -d "$i" -a ! -r "$i" ]; then exit 1; fi; done; fi ' sh {} \; -o -prune \) -a -print

完全なSolarisインストールの場合、GNU grepはで動作します/usr/sfw/bin/ggrep

答え2

ただフィルタリングしてください。

find . 2>&1 | grep -v "^find: cannot read dir .*: Permission denied$"

答え3

すべてのファイルに対してサブシェルを呼び出したくない場合は、jlliagreの回答に対するこの改善は、よりfind複雑にするACLがない限り、述語を使用してすべての操作を実行できます。読み取ることはできますが検索できないディレクトリを適切に処理することは練習のままです。以前にこれを見たことがない場合は、#!「このすべてをコマンドラインにコピーしないでください。代わりにそのままファイルに入れて呼び出しとしてchmod +x使用してください./nameoffile <directory>。」という意味です。

#! /usr/xpg4/bin/sh

PATH=/usr/local/bin:/usr/xpg4/bin:/usr/bin:/bin
export PATH

me="-user $(id -u)"
my_groups="( -group $(id -G | sed 's/ / -o -group /g') )"

prune_me="( ( $me ! -perm -0400 ) -prune )"
prune_group="( ( ! $me $my_groups ! -perm -0040 ) -prune )"
prune_other="( ( ! $me ! $my_groups ! -perm -0004 ) -prune )"

find "$@" $prune_me -o $prune_group -o $prune_other -o -print

関連情報