findで特定のディレクトリを検索対象外(除外)にする
複数ディレクトリをfindで検索する場合、特定のディレクトリを検索対象外にする方法です。
findコマンドの「-prune」と「-o (-or)」オプションの組み合わせで実現することができました。
UNIXの部屋 コマンド検索: find より
-prune
http://x68000.q-e-d.net/~68user/unix/pickup?find
それ以上ディレクトリを降りない。特定のディレクトリ以下を除外する場合に有用。
-o または -or
http://x68000.q-e-d.net/~68user/unix/pickup?find
検索条件を OR で結ぶ。
% find . -name abc -or -type d
⇒ abc という名前のファイル・ディレクトリか、あるいはディレクトリを検索
例)1つのディレクトリを対象外として、ファイルを検索する
「-path "./foo" -prune」で「./foo」以下については、それ以上ディレクトリを降りない指定をします。
これだけだと、「./foo」しか見つからない形になってしまうので、「-o」で追加の検索条件を指定します。
この例では「-type f -name "*.html"」でhtmlファイルを探すようにしています。
サンプル)ディレクトリ構造
(root) ├─ index.html │ ├─bar │└─ bar.html │ └─foo └─ foo.html
サンプル)findコマンド
$ find . -path "./foo" -prune -o -type f -name "*.html" ./bar/bar.html ./foo ./index.html
→「./foo/foo.html」はヒットしない。
例)2つ以上ディレクトリを対象外として、ファイルを検索する
上記と同じような形で、2つ以上ディレクトリを対象外としたい場合、「-o」オプションで条件を追加することで可能です。
※例コマンドの検索対象ディレクトリは上記と同じです。
サンプル)findコマンド
$ find . -path "./foo" -prune -o -path "./bar" -prune -o -type f -name "*.html" ./bar ./foo ./index.html
→「./bar/bar.html」「./foo/foo.html」はヒットしない。
補足)-prune について
「-prune」はディレクトリ以外(ファイル)にも使用出来るみたいですが、これはあまり意味がないようです。
(他のコマンドで代用可能であるため。)
UNIXの部屋 コマンド検索: find より
実際は -prune はディレクトリ以外にも効果があるので、
http://x68000.q-e-d.net/~68user/unix/pickup?find
% find . -name "*.txt" -prune -o -print
⇒ *.txt というファイルを除外する。
という使い方もできるが、これは
% find . ! -name "*.txt"
と同じである。
今回参考にしたページ
半無限長キープ - findで特定のディレクトリ以下を除外する
http://d.hatena.ne.jp/yanma_4/20080721/1216617075