hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

findで特定のディレクトリを検索対象外(除外)にする

複数ディレクトリをfindで検索する場合、特定のディレクトリを検索対象外にする方法です。
findコマンドの「-prune」と「-o (-or)」オプションの組み合わせで実現することができました。

UNIXの部屋 コマンド検索: find より

-prune
それ以上ディレクトリを降りない。特定のディレクトリ以下を除外する場合に有用。

http://x68000.q-e-d.net/~68user/unix/pickup?find

-o または -or
検索条件を OR で結ぶ。
% find . -name abc -or -type d
⇒ abc という名前のファイル・ディレクトリか、あるいはディレクトリを検索

http://x68000.q-e-d.net/~68user/unix/pickup?find

例)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 はディレクトリ以外にも効果があるので、
% find . -name "*.txt" -prune -o -print
⇒ *.txt というファイルを除外する。
という使い方もできるが、これは
% find . ! -name "*.txt"
と同じである。

http://x68000.q-e-d.net/~68user/unix/pickup?find

今回参考にしたページ

半無限長キープ - findで特定のディレクトリ以下を除外する
http://d.hatena.ne.jp/yanma_4/20080721/1216617075