conf t

インフラエンジニアのメモ

grepでディレクトリ配下のファイルを検索する

あのファイルが見つからない。そうだ、grepしよう!

Linux上でファイルを探す時に便利なgrepコマンド。
オプション無しだと同じディレクトリしか見てくれません。
探したいファイルの場所に全く検討がつかないときなど、ディレクトリ配下全部をgrepしてほしいですよね?
今回はディレクトリ配下のファイルをgrepで検索する方法をご紹介します。

パターン1 grepの-rオプションを使う

grep -r aaa ./*

上記では現在のディレクトリ配下(./*)のファイルに対して検索をかけています。

使用例

# grep -r aaa ./*
./20160229/test2.py:print ("aaaa", )
./20160416/test.txt:test aaaaa
./20160416/test.txt:if ( aaa aaa ) {
./20160416/test.txt:if ( aaa aaa ) {
./20160528/url.txt:http://aaa/bbb.html?huigina
./20160528/url.txt:http://aaa.bbb.ccc/ddd.html?huigina
./20160528/url.txt:http://aaa.bbb.ccc/ddd/ddd.html?huigina
./20160528/url.txt:http://aaa/
./20160528/url.txt:http://aaa.bbb.ccc/ddd.html%Ahuigina
./20160528/url.txt:http://aaa/%3A4B6C

パターン2 findを使う

find . -type f | xargs grep aaa

使用例

# find . -type f | xargs grep aaa
./20160229/test2.py:print ("aaaa", )
./20160528/url.txt:http://aaa/bbb.html?huigina
./20160528/url.txt:http://aaa.bbb.ccc/ddd.html?huigina
./20160528/url.txt:http://aaa.bbb.ccc/ddd/ddd.html?huigina
./20160528/url.txt:http://aaa/
./20160528/url.txt:http://aaa.bbb.ccc/ddd.html%Ahuigina
./20160528/url.txt:http://aaa/%3A4B6C
./20160416/test.txt:test aaaaa
./20160416/test.txt:if ( aaa aaa ) {
./20160416/test.txt:if ( aaa aaa ) {

私はパターン2を覚えていて使っていましたがパターン1はgrepにオプション1つで使えるのでタイプが楽で便利ですね。
パターン2の使い方はgrepのところを別のコマンドにしたり色々応用が出来ます。

grepで特定のディレクトリだけ除外するとき

実行例

# grep -r aaa ./* --exclude-dir={./20160528,./20160416}
./20160229/test2.py:print ("aaaa", )
./20160229/20160528/test.txt:grep test aaa

ディレクトリ配下をgrepしていると、たまに不要なディレクトリ内まで検索してしまうことがあります。
--exclude-dir=で除外するディレクトリを指定します。
上記実行例のようにかっことカンマを使えば複数ディレクトリを指定できますし、
以下のようにワイルドーカードを使って記述もできます。

実行例

# grep -r aaa ./* --exclude-dir=20160[45]*
./20160229/test2.py:print ("aaaa", )

1つめの除外例では./20160229/20160528/が除外されていませんが、2つ目の例では除外されています。
パスで記載するとパスで解釈され、
ファイル名だけで書くとファイル名にマッチしたらディレクトリがどこにあっても除外されるようです。