Powered by SmartDoc

ファイルの検索

正規表現

正規表現とは文字列のパターンの表記法で、viなどのエディタの文字列検索・置換、UNIXコマンドのファイル指定のパターンでも利用される。正規表現では一部の記号や文字にそれ自身とは異なる意味を持たせメタ文字と呼ぶ文字を使いパターンの表現に使用している。正規表現で使用されるメタ文字を表9.1[メタ文字など]に示す。

メタ文字など
メタ文字など 意味
. 任意の一文字
直前の文字の0または1回の繰り返し
直前の文字の0回以上の繰り返し
直前の文字の1回以上の繰り返し
[-] 範囲指定
[^文字] 文字を含めない
行頭
$ 行末
\ 文字をエスケープする
{n} 直前のパターンをn回繰り返す
{n,} 直前パターンとn回以上一致する
{n,m} 直前パターンとn回以上、m回一致する
(パターン) パターンをグループ化する
パターン1|パターン2 パターン1またはパターン2

正規表現には方言が多数あるので使用するアプリケーションや言語などによってメタ文字が異なるので注意。

メタ文字を複数組み合わせた場合の例を表9.2[正規表現の使用例]に示す。

正規表現の使用例
意味
.* すべての文字の組み合わせ
[a-zA-Z] 大文字小文字を区別せず、アルファベットの任意の一文字
[a-z]+ アルファベット小文字の一文字以上のすべての組み合わせ
[1-9][0-9]* 0より大きい整数

grep

grepコマンドは正規表現を使ったファイル内文字列検索コマンドである。

書式とオプション

grepコマンドの書式
grep [オプション] パターン [ファイル]

ファイルの指定にはワイルドカード等が使用でき、ファイルを省略した場合、標準入力が対象になる。

grepコマンドの主なオプション
オプション 意味
-A n 検索結果のn行後の行も表示する
-B n 検索結果のn行前の行も表示する
-C n 検索結果の前後n行も表示する
-c 検索結果の件数を表示する
-E 拡張正規表現を使用する
-G 基本正規表現を使用する(デフォルト)
-H 検索結果のファイル名を表示する
-R,-r 再帰的検索を実施する

使用例

  1. カレントディレクトリの全ファイルの中で文字列linuxを含むを検索する。
  2. カレントディレクトリ以下の全てのファイルの中で文字列Linuxを含むファイルを検索する。
  3. /etc/passwdからaで始まる行を検索する
$ grep linux *
$ grep -R linux *
$ grep ^a /etc/passwd

findコマンド

findコマンドはパターンや条件に合うファイルやディレクトリを検索、その結果を使ったファイル操作のできるコマンドで、その都度ファイルを検索するので対象ファイルが多い場合は結果を得るまでに時間がかかる。

書式とオプション

findコマンドの書式
find [オプション] 検索対象パス名 [評価式]

代表的なオプション、主な評価式を表9.4[findコマンドの主な評価式]に示す。

-depth
ディレクトリ本体の前に、ディレクトリの内容を先に検索対象とする。
-follow
シンボリックリンクの参照先も検索する

評価式に数値は次のように扱われる。

+n
nより大きい
-n
nより小さい
n
ちょうどn
findコマンドの主な評価式
評価式 意味
-atime日数 最後のアクセス時間が指定した日数前のファイルやディレクトリを検索する
-empty 空のファイルや中身のないディレクトリを検索する
-groupグループ名 指定したグループ名のファイルやディレクトリを検索する
-mmin分数 指定した分数前に修正されたファイルやディレクトリを検索する
-mtime日数 指定した日数前のファイルやディレクトリを検索する
-nameパターン パターンと一致するファイルやディレクトリを検索する
-permモード 指定したモードと一致するファイルやディレクトリを検索する
-typeタイプ 指定したタイプと一致するファイルやディレクトリを検索する(dはディレクトリ、fはファイル、lはシンボリックリンク)
-sizeサイズ 指定したサイズと一致するファイルやディレクトリを検索する

評価式の結果に対するアクションは次の通り

findコマンドの主なアクション
アクション 意味
-ls 検索結果を詳細に表示する
-execコマンド{} \; 検索結果に対して指定したコマンドを実行する。{}は検索結果のファイルやディレクトリに置き換わる。

使用例

カレントディレクトリ以下でちょうど一週間前に変更されたファイルやディレクトリを検索する。評価式-mtimeを使う。

$ find . -mtime 7

カレントディレクトリ以下で10分前までにアクセスされたファイルやディレクトリを検索する。評価式-aminを使う

$ find . -amin -10 

カレントディレクトリ以下で今から60〜90前の間に作成されたファイルやディレクトリを検索する。

$ find . -cmin +60 -cmin -90

~/src以下で拡張子.cのファイルを探す。評価式-nameを使い、ファイル名のパターンを指定する。

$ find ~/src -name "*.c"

ホームディレクトリ内から拡張子が.txtではないファイルを探し、詳細な情報を表示する。評価式に\!を付けて否定し、さらに-lsアクションを指定する。

$ find ~/ \! -name "*.txt" -ls

パーミッションが777のファイルを探す。評価式-permを使い、モードを8進数で指定する。

$ find . -perm 777 -print

カレントディレクトリ内の0バイトのファイルを削除する。評価式-sizeとアクション-execを使用する。

$ find . -size 0 -exec rm {} \;

評価式は複数組み合わせて使用できるのでいろいろと試してみてください。