SE&ビジネスパーソンとしてお勉強中なブログ

スポンサーサイト

--/--/-- -- [Edit]

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

findコマンド

2010/02/14 Sun [Edit]

名前

find - ディレクトリ階層下のファイルを検索する。

書式

find [path...] [expression]

注意

OSによって使用可能なオプションが大きく異なるので、マニュアルでの確認を忘れずに。




名前で検索

先頭にabが付くファイル、ディレクトリを検索
find . -name "ab*" -print
ファイルだけ検索
find . -name "ab*" -type f -print
ディレクトリだけ検索
find . -name "ab*" -type d -print
大文字、小文字の区別をしないでファイル名から検索
find . -iname "ab*" -type f -print
3文字のファイルを検索
find . -name "???"

ファイルサイズから検索

1024バイトのファイルを検索
find . -size 1024c -type f -print
1024バイトより大きいファイルを検索
find . -size +1024c -type f -print
1024バイトより小さいファイルを検索
find . -size -1024c -type f -print
※ sizeで指定した数字の後の文字で単位を指定できる。 省略した場合は、bを指定した場合と同じ。

    b  512バイトのブロック

    c  バイト

    k  キロバイト

    w  2バイトのワード

※ 数値の引き数

    +n   nより大きい

    -n   nより小さい

     n   nと等しい

※ -type c ファイルの種類

    b    ブロックデバイス

    c    キャラクタデバイス

    d    ディレクトリ

    f    ファイル

    l    シンボリックリンク

    p    名前付きパイプ

    s    ソケット (UNIX ドメインソケット)

    D    Door (Solaris のみ)

日付から検索

3日前に修正されたファイル
find . -mtime 3
2日以内に修正されたファイル
find . -mtime -3
4日以前に修正されたファイル
find . -mtime +3
30分以内に修正されたファイル
find . -mmin -30
5日以前にアクセスされたファイル
find . -atime +4
2日以内にファイルステータスが変更されたファイル

※権限とかOwnerとかの変更

find . -ctime -3
ファイル[ghi.txt]よりタイムスタンプが新しいファイル・ディレクトリを検索
find . -newer ghi.txt
ファイル file[ghi.txt] よりタイムスタンプが古い
find . ! -newer ghi.txt

ファイルの所有者から検索

所有者が[onion]のファイルを検索
find . -user onion -type f -print
指定のグループに属するファイルを検索
find . -group onion -type f -print

パーミッションから検索

パーミッションが644のファイル・ディレクトリを検索して詳細を表示する
find . -perm 644 -ls

検索範囲を限定する

2階層目までを検索する。

※0 階層目 (指定した検索開始ディレクトリ)、1階層目も含まれている

find . -maxdepth 2 -name "ab*"
2階層目以降のディレクトリを検索する。

※2階層目未満のレベルのディレクトリには評価やアクションを行わない。

find . -mindepth 2 -name "ab*"
2階層目だけを検索する。
find . -maxdepth 2 -mindepth 2 -name "ab*"

※-maxdepth、-mindepthはオプションなので前に寄せて使用する。

以下の例では、ファイル名が"ab*"の評価式が真だろうが偽だろうが、オプションの-maxdepthは実行されていることに注意。

ちなみにこれを実行してみるとWarningが出たりする。

 

find . -name "ab*" -type f -maxdepth 2

※全てのオプションは常に効力を持ち、式の評価がオプションの位置に到達したときにのみ実行される訳ではない。 従って記述を明確にするためには、全てのオプションは評価式の先頭部にまとめて置くのが望ましい。

条件の結合・否定など

AND条件 -a または -and

検索条件を AND で結ぶ。

複数の検索条件を並べて書けば AND として扱われるので、普通は省略する。

OR条件 -o または -or
ファイル名がabまたはdeで始まるファイルを検索
find . -name "ab*" -type f -o -name "de*" -type f

以下のようにも書ける

find . \( -name "ab*" -o -name "de*" \) -type f

 

ちなみに以下を実行すると"ab*"にマッチするディレクトリ名も出てくる。

これは-oの左辺が真となると右辺の-type fが実行されない為。

find . -name "ab*" -o -name "de*" -type f
否定条件! または -not

他の条件の前に付けて、条件を否定する。

ownerが"onion"以外のファイルを検索
find . ! -user onion -type f -print

アクション

    -ls  詳細を一覧表示する

    -print  検索結果の標準出力

    -fprint  [file name] 検索結果を指定したファイルに書き出す

    -exec  [command] {} \; 検索結果をコマンドに引き渡して実行

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

    -ok  -execと同じだけど、実行するか問い合せる。実行するならy。実行しないならy以外を入力。

ディレクトリ名が"hoge"にマッチするディレクトリを除外して検索
find . -name "hoge" -type d -prune -o -print
ディレクトリ名が"hoge"にマッチするディレクトリを除くディレクトリを検索
find . -name "hoge" -type d -prune -o -type d -print

-oの効果で(-name "hoge" -type d -prune)が真の場合は、 右辺のprintが実行されないので、hogeディレクトリ以下が出力されてこない。

先頭にdefがつくファイルを検索してgrepコマンドを実行する。
find . -name "def*" -type f -exec grep -n http {} /dev/null \;

{}の場所には検索したファイル名が入る。

execオプションは「;」までをコマンドとして実行する。

エスケープしないとシェルの終了として受け取られてしまう。

「{}」と「\」の間には必ずスペースを空けなくてはならない。

execは、xargsを使用して代替が可能。

find . -name "def*" -type f -print | xargs grep -n http /dev/null

xargsは、標準入力から引数を読み込み、指定のコマンドを実行するコマンド。 引数が最大長(ARG_MAX)を超えそうな場合は、コマンドを複数回に分けて実行してくれる。

※最大長は「getconf ARG_MAX」で確認できる。

-execでコマンドを実行する場合、findの結果が5万件なら5万回コマンドを実行することになる。

xargsを使用した場合、ARG_MAX以下であれば1回だけコマンドを実行する。

よってパフォーマンス的にもxargsの方が優れている。

xargsを使用するときに注意したいのが空白を含んだファイルを取り扱う場合。

'hoge hoge.txt'のようにファイル名に空白が入っている場合、「hoge」「hoge.txt」でコマンドを2回実行しようとして、期待した結果を得られない。

この場合は、以下のようにすると良い。

find . -name "def*" -type f -print0 | xargs -0 grep -n http /dev/null

print0を使うことによってfindの出力がヌル文字("\0″)で区切られて出力される。

xargsも-0オプションを使用することによって引数がヌル文字で区切られているものとして処理を行う。

-0オプションの説明(マニュアルから抜粋)

標準入力からの文字列の区切りに、空白ではなくヌル文字が使われているとみなす。 また引用符やバックスラッシュに特別の意味を持たせず、すべての文字をそのまま用いる。

ちなみにgrepの引数に/dev/nullを追加しているのはgrepコマンドの結果に常にファイル名が付くようにしたかったから。

grepコマンドは検索対象ファイルが1つしかない場合にファイル名を表示しない。

先頭にdefがつくファイルを検索して、実行を確認しながら削除する。
find . -name "def*" -type f -ok rm {} \;

ちなみに一回の検索結果に対して複数コマンドの実行が可能

find . -name "def*" -type f -exec ls {} \; -exec grep http {} \;

但し、実行コマンドが真でないと後続のコマンドは実行されないので注意

find . -name "def*" -type f -exec grep http {} \; -exec ls -l {} \;

httpを含まないファイルに対してlsコマンドは実行されない

その他 Tips

検索開始ディレクトリを複数指定する
find /home/onion /tmp -name "aaa"
自分のファイルのみ検索
$ find . -type f -user `whoami`
find . -type f -ctime -30 -not -regex ‘.*svn.*' -exec ls {} -al \;

Prev
ベトナム戦記
Top
SE&ビジネスパーソンとしてお勉強中なブログ
Next
ビジネスマンのための「読書力」養成講座

Comments

 
 
 
 
 
 
 
  非公開コメント
 

Track Backs

TB URL 

Top
SE&ビジネスパーソンとしてお勉強中なブログ

ブログ内検索

カテゴリー

最近の記事

最近のコメント

最近のトラックバック

RSSリンク

Amazon

楽天 人気商品

なかのひと

iKnow

Dictationバッジ

合わせて

あわせて読みたいブログパーツ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。