home wiki.fukuchiharuki.me
Menu

キーワード

  • find
  • 除外

したいこと

特定のディレクトリを除外してファイルを検索します。

どうやって

たくさんオプション(評価式やアクション)がついて難解ですが次のようにします。

$ find . -type d -name HOGE -prune -false -o -type f

くわしく

findは評価式を左から評価する仕組みのようです。

find は与えられたファイル名以下のディレクトリツリーを検索し、同じく与えられた評価式を左から右に向かって優先順位の高いものから評価する

なので左から見ていきましょう。

find .

カレントディレクトリを探す。

-type d -name HOGE

ディレクトリ、HOGEという名前の。

-prune

ディレクトリを降りない。

-false

偽。

-o

でなければ、

-type f

ファイル。

-prune はアクション

「-prune」はオプションではなくアクションです。

-prune 以外のアクションが評価式に含まれていない場合は、評価式の結果が真となったファイルに対して -print が実行される。

アクションの内容は次です。

同時に -depth が指定されていない場合は常に真。ディレクトリを降りない。

ディレクトリより下を見ずに真を返すアクションです。ただしこのままだとHOGEを出力してしまうので-pruneのあとに-falseを書いて抑制します。

演算子が省略された場合は -and が指定されたものとされる。

従って左から順に評価式(やアクション)で偽になれば後続の評価式(やアクション)に至りません。これはプログラミングのif文と同じように考えます。if (A && B)はAがfalseであればBを評価しません。Bを評価するのはAがtrueのときです。

「-and」と同じように考えると「-o」を「でなければ」と読めます。

つまりこうなっている

  • HOGE/ (ディレクトリ)
    • -falseで偽、-type fで偽
  • HOGE/ 以下のディレクトリとファイル
    • -pruneでディレクトリを降りない
  • HOGE/ 以外のディレクトリ
    • -name HOGEで偽、-type fで偽
  • HOGE/ 以外のファイル
    • -type dで偽、-type fで真(-printを実行)