探す

探します。

find

ファイル名で探します。

ワイルドカードやファイルグロブは下記です。shellの話しです。lsなどでも使えます。下記を覚えておけば、困ることはないでしょう。

* 任意の文字列にマッチする。0文字もマッチする。
? 任意の1文字にマッチする。
[0-9] 0から9の1文字にマッチする。
[a-z] aからzの1文字にマッチする。
[A-Z] AからZの1文字にマッチする。

.はcurrent directoryを示しています。今、自分が居る場所から再帰的にディレクトリを辿って結果を返します。


% find . -name "*.txt"

下記の様な検索が必要になったら、ディレクトリ構成やファイル名を見直した方がいいと思います。


% find . -name "[0-9][0-9]_*.???"
% ls [0-9][0-9]*

高度な検索

ディレクトリだけを探したい場合。


% find . -type d -name "*src*"

シンボリックリンクだけを探したい場合。


% find . -type l -name "sandbox"

パーミッションが777のファイルとディレクトリを探したい場合。


% find . -perm 777
man findは、くじけます。

locate

データベースが作成されている場合は、locateを利用しましょう。


% locate locate

grep

テキストファイルの中の文字列で探します。

g/re/pです。

まずは、aliasの設定をします。拡張正規表現を使うためです。egrepです。()を使うときに書き方に差がでます。常にegrepでいいと思います。ついでに行番号も出力させるようにします。この設定は非常に重要です。

~/.tcshrc

alias grep 'grep -E -n'
alias gr grep

~/.bashrc

alias grep="grep -E -n"
alias gr=grep

まずは、簡単なところから。
ワイルドカード*は任意の文字列にマッチするので、ディレクトリにあるファイル全部がマッチします。


% grep 検索したい文字列 *
% grep 検索したい文字列 */*
% grep 検索したい文字列 */*/*

上述の方が適切な場合もありますが、大体は再帰的に全て検索して問題ありません。


% grep 検索したい文字列 -r .

% grep 検索したい文字列 -r . | grep -v 該当行の表示を除外したい文字列

ここまでの説明のfindとgrepで、かなりの検索ができます。大体はなんとかなるはずです。

Regular Expression

文字の並びを、なんとかの繰り返し、などとして扱いやすいように表現し直した決まりを覚えると高度な検索ができます。

egrepの正規表現です。簡単なことしか説明しないので、色々なスクリプト言語、grepのバージョンに依存しないで使えると思います。それぞれの独自の拡張表現には触れていないつもりです。

先に何ができるかを示します。egrepであることを示すために上述のalias名で示します。

先頭がaまたはbで始まる行を探す

シングルクォート’で囲みます。shellに何もさせないためです。

()を使うと文字の並びをグルーピングできます。そして、マッチした文字列を取り出すことができます。下記では意味がありませんが、複雑な正規表現を書くと非常に便利になります。


% gr '^[ab]' -r .
% gr '^(a|b)' -r .
最後がaまたはbで終わる行を探す


% gr '[ab]$' -r .
% gr '(a|b)$' -r .

grepだと下記の書き方になります。grepは拡張正規表現ではなく基本正規表現だからです。とは言っても、色々と状況はにじんでいます。拡張正規表現で使う文字をリテラル文字ではなくメタ文字として使う場合は下記の様にバックスラッシュが必要になります。


% grep '\(a\|b\)$' -r .

egrepの正規表現でよく使うものを整理します。*と?がワイルドカードと意味が異なり、.*や[a-z]*や.?や[a-z]?のように使って、繰り返しを表します。

. 任意の1文字にマッチする。
^ 行の先頭にマッチする。
$ 行の最後にマッチする。
.* 任意の1文字のゼロ回以上の繰り返しを表現している。なんにでもマッチする。
.? 任意の1文字がゼロ回または1回。あってもなくてもよい文字を表現している。
.+ 任意の1文字の1回以上の繰り返しを表現している。
[a-z]* 英字小文字のゼロ回以上の繰り返しを表現している。[a-z]*_[a-z]*などのように使う。
[a-z]? 英字小文字がゼロ回または1回。あってもなくてもよい英字小文字1文字を表現している。
[a-z]+ 英字小文字の1回以上の繰り返しを表現している。[a-z]+_[a-z]+などのように使う。
* 直前の文字または文字列のゼロ回以上の繰り返しを表現している。
? 直前の文字または文字列のゼロ回または1回。
+ 直前の文字または文字列の1回以上の繰り返しを表現している。
(A1000|a1000) A1000またはa1000。チームで決まりを決めても表記ゆれは出る。無理矢理に探す。謎の番号もよくある。多くの場合に謎の番号探しは進捗に寄与する。
\. .をマッチさせたいとき。ときどき使う。メタ文字.をリテラル文字.として扱う。

自分は無理矢理に探すので、まず使わないですが繰り返し回数を指定すると便利な場合があります。

[0-9]{8} 8桁の数字列を表現している。
[0-9]{8,} 8桁以上の数字列を表現している。
[0-9]{8,10} 8桁以上10桁以下の数字列を表現している。
カテゴリーUNIX

コメントを残すために、Twitter OAuthを必要としています。ご了承ねがいます。
コメントは、Twitterに影響しません。

Twitter OAuth