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
何を達成したいのかわかりませんが、サブディレクトリは必要ありませls
んgrep
。たぶんあなたが使用したり、あなたのニーズを満たすことawk
ができますかsort
?
答え4
find /tmp -type d ! -perm -775 -prune -o -type f -name dsm\*