Solaris 10 では find を使用して単一ディレクトリを検索しますが、サブディレクトリは検索しません

Solaris 10 では find を使用して単一ディレクトリを検索しますが、サブディレクトリは検索しません

find検索からサブディレクトリを除いて、ディレクトリの内容を一覧表示するためにSolaris 10で使用しようとしています。私は以下に基づいてコマンドを試しました。sdaauが提案したソリューション:

find /tmp -type d ! -perm -u+rx -prune -o -type f -name dsm\*

残念ながら、目的の結果を返すことに加えて、まだ次のエラーが発生します。

find: cannot read dir /tmp/hsperfdata_oracle4: Permission denied
find: cannot read dir /tmp/hsperfdata_jsweb: Permission denied

/ tmpには、実行ユーザーにfind読み取り権限またはパススルー(実行)権限がない複数のディレクトリがあります。

-bash-3.2$ ls -ld /tmp/hsp*
drwxr-x---   2 jsweb    other        117 Jan  5 13:00 /tmp/hsperfdata_jsweb
drwxr-x---   2 oracle4  dba4         117 Nov  5 19:51 /tmp/hsperfdata_oracle4
drwxr-xr-x   2 root     root         117 Jan 22 08:58 /tmp/hsperfdata_root

findゼロ以外の戻りコードで終わらないように、これらのエラーを取り除く方法を見つける必要があります。私は何を見落としていますか?

答え1

これらのエラーを削除して終了ステータスを無視できます。

find /tmp -name dsm\* -type f 2> /dev/null || :

それでもstderrを維持し、findアクセス制限のためにディレクトリを入力またはリストできない以外のエラーが表示される場合は、これらの権限の問題を検出する構文を試してみることができますが、これは難しい場合があります。

アクセス権のないディレクトリは、権限と所有権(ユーザーとグループ)によって異なります。次のようなものが必要です。

export "PATH=$(getconf PATH):$PATH"
u=$(id -u) g=$(id -G | sed 's/ / -o -group /g'); IFS=" "
find /tmp -type d ! \( \
    -user "$u" -perm -u=rx -o \
    ! -user "$u" \( -group $g \) -perm -g=rx -o \
    ! -user "$u" ! \( -group $g \) -perm -o=rx \
  \) -prune -o -type f -name dsm\* -print

私がテストした結果、Solaris 11ではfindディレクトリを整理してもディレクトリを読み取ることができないと文句を言います。Solaris 10では何もできません。一人-pruneで彼らに教えてください。

それで、ソラリスはfindこの点では希望がないようです。代わりにperlモジュールを使用できますFile::Find

また、上記のアプローチは、ACLやその他のセキュリティ制限ではなく、単純なUnix権限のみを考慮することに注意してください。

答え2

あなたの例では、! -perm -u+rxこれは事実として評価されません。所有者はまだ権利を持っています。! -perm -o+rxしたがって、以下を使用する必要があります。

find /tmp -type d ! -perm -o+rx -prune -o -type f -name dsm\*

答え3

何を達成したいのかわかりませんが、サブディレクトリは必要ありませlsgrep。たぶんあなたが使用したり、あなたのニーズを満たすことawkができますかsort

答え4

find /tmp -type d ! -perm -775 -prune -o -type f -name dsm\*

関連情報