Top > Unix > find

find Edit

findもまたどんな条件でも検索できるが、その分オプションが多くマスターするのが難しいといういかにもUnix的なコマンドである。

名前で探す Edit

find . -name '*hoge*'

大文字・小文字を区別しないようにするには:

find . -iname '*hoge*'

3日以内に変更されたファイルを探す Edit

find . -mtime -3

5日以上前に変更されたファイルを探す Edit

find . -mtime +4

+5でないことに注意!

find コマンドの -mtime は +1 でも2日前のファイルが対象
http://sonic64.com/2005-07-06.html

find-mtime2_0.GIF

以下の式で覚えよう。

・-mtime n にマッチするもの
(now - mtime) / 24 == n
・-mtime -n にマッチするもの:
(now - mtime) / 24 < n
・-mtime +n にマッチするもの:
(now - mtime) / 24 > n

30分以内に変更されたファイルを探す Edit

find . -mmin -30

50分以上前に変更されたファイルを探す Edit

find . -mmin +50

通常ファイルだけを探す Edit

find . -type f

type として指定できる文字は:

f通常ファイル
dディレクトリ
lシンボリックリンク
bブロックデバイス
cキャラクタデバイス
p名前付きパイプ
sソケット

普通は f, d だけ覚えておけば十分でしょう。
これらの文字は ls -l で1桁目に表示される文字と同じです。

drwxr-xr-x   14 root     root      4096  4月 30 12:28 web/
↑これ

パーミッションで探す Edit

-perm。
-mtimeなどと同じように、xxx、-xxx、+xxx いう指定の仕方があります。

xxx :perm == xxx のとき真。                  ビットが完全に一致するとき
-xxx:perm & xxx == xxx のとき真。            指定ビットの全てが立っているとき(AND)(これが一番よく使うと思う)
+xxx:perm & xxx != 0 のとき真。              指定ビットのいずれかが立っているとき(OR)

所有者が書き込み権限を持つものを検索:

find . -perm -200

条件のor, and Edit

基本的に条件を並べると and になります。つまり、以下は「hoge」で始まるディレクトリだけを探します:

find . -name 'hoge*' -type d

「-or」を使うと or 検索になります。以下は名前が「hoge」で始まるもの、またはディレクトリを探します:

find . -name 'hoge*' -or -type d

.svnやCVSディレクトリを除外する Edit

カレントディレクトリから通常ファイルを検索する。ただし.svnまたはCVSディレクトリ以下は除く:

find . \! \( \( -name .svn -o -name CVS \) -prune \) -type f

これは次のように解釈する:
ファイル名が.svnまたはCVSなら、

1. \( -name .svn -o -name CVS \)が真となり、
2. よって-pruneが評価され(これは常に真)、よってそのディレクトリ以降へは下りない
3. \! によって反転して偽となるため、そのディレクトリ(.svnまたはCVS)自身は除かれる

ファイル名が.svnまたはCVSでないなら、

1. \( -name .svn -o -name CVS \)が偽となり、
2. \! によって反転して真となるため、それ以降の引数(-type f)が評価される。

find: ./portsentry: 許可がありません Edit

検索ディレクトリ以下にパーミッションがないディレクトリがあると

find: ./portsentry: 許可がありません

というメッセージがまじってしまいます。
これが出ないようにするには、

find . 2>/dev/null

と「2>/dev/null」をつけます。

findの挙動を理解する(評価式の考え方) Edit

findは指定ディレクトリ内の全ファイルそれぞれに対し、評価式を評価する。

評価式はオプション、判別式、及びアクションからなる(これらをプライマリとも呼ぶ)。

オプション:-versionや-helpなど。コマンド全体の挙動に影響する
判別式:-name PATTERN、-mtime N、-newer FILEなど。真または偽の値を返す。
アクション:-print, -prune, -ls, -execなど。付加的な作用を持ち、真または偽を返す。

アクションも値を持つことに注意。
評価式は左から評価され、値が決定した時点で評価は終了する。

Edit

find . ! \( -name .svn -prune \) -name \*.php -or -name \*.inc

これはディレクトリ.svn以下を除いて*.phpと*.incを探す。

.svnというディレクトリに対してこの評価式が評価されると次のようになる。
1. -name .svnが真になる
2. その後に-pruneが続いているので(-andが省略されている)、-pruneを評価する。-pruneは常に真である。
3. !により「! \( -name .svn -prune \)」の部分は偽となる。
4. -or以降の部分を評価する。
5. -name \*.incが偽になる。
6. よって評価式全体は偽となり、評価が完了する。

hoge.phpというファイルに対してこの評価式が評価されると次のようになる。
1. -name .svnが偽になる
2. よって-pruneを評価するまでもなく()の中は偽になる(だから-pruneは実行されない)
3. !により「! \( -name .svn -prune \)」の部分は真となる。
4. -name \*.phpが続いているので(-andが省略されている)これを評価する。真。
5. よって-or以降を評価するまでもなく、評価式全体は真となる。
6. 真だがアクションが何も指定されていないので、-printが実行され、評価が完了する。

例2(アクション省略時の-printについて) Edit

以下はどれも、.svn以下を除いて通常ファイルだけを検索することを意図したコマンドである。

1)

find . ! \( -name .svn -prune \) -type f

2)

find . -name .svn -prune -or -type f

3)

find . -name .svn -prune -or -type f -print

上記のうち、1)では.svnが表示されないが、2)では表示され、3)では表示されない。
1)と2)の違いはなんだろうか?
アクションを何も指定しない場合、-printが実行される。これは評価式が ( given expression ) -print と変換されるということである。よって1)と2)はそれぞれ次のようになる。
1')

find . \( ! \( -name .svn -prune \) -type f \) -print

2')

find . \( \( -name .svn -prune -or -type f \) -print

.svnに対してこの評価式を評価すると、1')では偽になり-printは実行されない。
2')では真になり-printが実行される。

演算子の優先順位(-orより-andの方が強い) Edit

( expr )
! expr
-not expr
expr1 expr2
expr1 -a expr2
expr1 -and expr2
expr1 -o expr2
expr1 -or expr2
expr1 , expr2


URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

Attach file: filefind-mtime2_0.GIF 644 download [Information] filefind-mtime2.GIF 527 download [Information] filefind_mtime.GIF 601 download [Information]

Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup Referer   Help   RSS of recent changes