Linuxでファイルやファイルの内容を検索する方法(find, grep)

Linuxでファイルやファイルの内容を検索する方法(find, grep)

ここでは、Linuxでファイルやディレクトリを検索したり、ファイルの内容を検索するときに使用するコマンド(find, grep)の書式や検索方法を紹介します。

findコマンド

findコマンドは、ファイル名や属性情報に基にづいた検索を行うときに使用します。

書式

find [検索するパス] [検索条件]

使用例

/etcディレクトリ配下でファイル名が「.conf」で終わるファイルを検索

# find /etc -name '*.conf'

/etcディレクトリ直下でファイル名が「.conf」で終わるファイルを検索

# find /etc -maxdepth 1 -name '*.conf'

カレントディレクトリ配下で1日以内に更新されたファイルまたはディレクトリを検索

# find . -mtime -1

カレントディレクトリ配下で60分以内に更新されたファイルを検索

# find . -type f -mmin -60

/tmp配下で100日以上変更がないディレクトリを検索

# find /tmp -type d -mtime +100

カレントディレクトリ配下でファイルサイズが5,000KBを超えるファイルを検索

# find . -size +5000k

カレントディレクトリ配下で1Mバイト以上のファイルの詳細な情報を一覧表示

# find ./ -size +1024k -ls

カレントディレクトリ配下でファイルの所有者がstudentであるファイルまたはディレクトリを検索

# find . -user student

カレントディレクトリ配下でパーミッションが「rwxr-xr-x」(755)のファイルを検索

# find . -perm 755

/usr/bin以下でSUIDビットが立っているファイルを検索

# find /usr/bin -type f -perm -u+s

また、findコマンドでは、検索条件に一致するディレクトリやファイルに対して、一括で処理を実行させることもできます。

カレントディレクトリ配下で21日以上変更がなく、ファイル名が「.bak」で終わるファイルを削除

# find . -name "*.bak" -mtime +21 -exec rm {} +

カレントディレクトリ配下で0バイトのファイルを削除

# find . -size 0 -exec rm {} +

カレントディレクトリ配下のディレクトリのアクセス権を755に一括設定

# find . -type d -exec chmod 755 {} +

カレントディレクトリ配下のファイルの所有者とグループを一括変更

# find . -type f -exec chown nginx:nginx {} +

カレントディレクトリ配下のファイルそれぞれの行数を確認

# find . -type f | xargs wc -l

grepコマンド

grepコマンドは、ファイルの内容から条件にマッチした行を検索するときに使用し、grepコマンドの検索条件には正規表現が利用できます。

書式

grep [オプション] [検索条件] [検索するパスやファイル]

使用例

httpd.confの内容から「root」という文字列が含まれる行を検索

# grep -i 'root' httpd.conf

ファイル名の末尾が「.html」であるファイルの内容から「charset」という文字列が含まれる行を検索

# grep 'charset' *.html

/etc配下でファイルの内容に「charset」という文字列が含まれているファイルを検索

# grep -rl 'charset' /etc

sample.txtの中から、行頭が「#」で始まる行以外を検索

# grep -v '^#' sample.txt

test.txtの中から「foo」「bar」「buz」が全て含まれる行を検索

# grep 'foo' test.txt | grep 'bar' | grep 'buz'

sample.txtの中から「a」または「z」を含む行を検索

# grep '[az]' sample.txt

sample.txtの中から「f~l(fghijkl)」のいずれかの文字を含む行を検索

# grep '[f-l]' sample.txt

test.txtの中から「good」と一致する行を検索

# grep -x 'good' sample.txt

sample.txtの中から「a」「m」「z」のいずれかを含む行を検索

# grep -E 'a|m|z' sample.txt

test.txtの中から「j」を含む行を検索し、行番号を付加して表示

# grep -n 'j' test.txt

あとがき

たいていの検索は、ここで挙げた検索例でまかなえると思いますよ。