(スタックオーバーフローからコピーされた: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
。
答え2
find実装はテストをサポートしていないので(フルパス名に拡張する必要があります)-path
を使用してシミュレートできます。-exec test "{}" = "/path/to/exclude" \; -prune
{}
test
残念ながら、プログラムは実行ごとに実行されるため、「純粋な」ルックアップよりも時間がかかります。したがって、可能であればテストを最適化してください。たとえば、次の 2 つのうちどれがより速く実行されるかを確認します。
-exec test "{}" = "/dev" \; -o -exec test "{}" = "/proc" \; -o -exec test "{}" = "/tmp/test" \;
または
-exec test "{}" = "/dev" -o "{}" = "/proc" -o "{}" = "/tmp/test" \;
test
プログラムは一度だけ実行されるので、後者は全体的に速くなければならないと思います。
-a
注: は必要ありません。デフォルトでは暗黙的です。-print
結局同じことが起こりました。