Solarisのfindコマンドからフルディレクトリパスのリストを除外する方法

Solarisのfindコマンドからフルディレクトリパスのリストを除外する方法

(スタックオーバーフローからコピーされた:https://stackoverflow.com/questions/7854975/how-to-exclude-a-list-of-full-directory-paths-in-find-command-on-solaris)

Solarisで所有されていないファイルとディレクトリを見つけるためにスクリプトを使用する必要がある非常に具体的な要件があり、何千もの所有されていないファイルが含まれる可能性があるため、ディレクトリパス全体をルックアップから除外できる必要があります(ファイルがホストされるため、正常です)。他のファイル)サーバー)。サーバーが停止するため(CPUが長期間99%に急増)、これらのディレクトリで検索を実行したくありません。したがって、egrepで検索結果をパイピングしてこれらのディレクトリをフィルタリングすることはオプションではありません。

いくつかのディレクトリの1つを名前で除外するためにこれを行うことができることを知っています。

find / -mount -local \( -type d -a \( -name dir1 -o -name dir2 -o dir3 \) \) -prune -o \( -nouser -o -nogroup \) -print

ただし、これはすべてのディレクトリのディレクトリ構造のどこにでもdir1とdir2と一致します。いいえ私が欲しいもの。

私はfindが次のディレクトリで検索するのを防ぐことができるようにしたいと思います(例えば):

/opt/dir1
/opt/dir2
/var/dir3/dir4

私はまだ、次の場所で所有されていないファイルとディレクトリを探したいと思います。

/opt/somedir/dir1
/var/dir2
/home/user1/dir1

-nameパラメーターに正規表現を使用してみましたが、findは見つかったデフォルト名と「name」のみが一致するため、パスを指定できません。残念ながら、Solaris のルックアップは -wholename や -path などの GNU ルックアップオプションをサポートしていないため、少し問題があります。

私の目標は、次の構文を使用するスクリプトを作成することです。

script.sh "/path/to/dir1,/path/to/dir2,/path/to/dir3"

find スクリプトと標準 sh スクリプト (/bin/sh) を使用して Solaris (5.8 以降) でこれを行うにはどうすればよいですか?

ベストアンサー1

フルパスでファイルを一致させることはできません。ソラリスfindしかし、inodeごとにファイルを一致させることができます。したがって、ls -iクリーンアップするinodeリストの生成を使用してからを呼び出しますfind。これは、クリーンアップしようとしているディレクトリがあまり多くないため、コマンドラインの長さの制限を超えると想定されます。

inode_matches=$(ls -bdi /opt/dir1 /opt/dir2 /var/dir3/dir4 |
                sed -e 's/ *\([0-9][0-9]*\) .*/-inum \1 -o/')
find / -xdev \( $inode_matches -nouser -o -nogroup \) -prune -o -print

もう1つのアプローチは、PerlまたはPythonスクリプトを使用して独自のディレクトリナビゲーションを実行することです。 Perlには、モジュールのfind2perl使用を開始するのに役立つスクリプトが付属していますFile::Find。 Pythonでは、モジュールwalkの関数を参照してくださいos.path

おすすめ記事