はじめに
ターミナル上で頻繁に使うfind
やgrep
ですが、何度使っても文法を忘れるので一回まとめることにしました。
TL;DR
あるディレクトリ下の、特定のパターンのファイル名に対してgrepしたい場合は以下のコマンドで解決できます。
grep <pattern> --include=<filename> -r
※2019/8/8更新。@tsuyoshi_cho さん、コメントありがとうございます!
(参考リンク: https://boxnos.hatenablog.com/entry/20071003/1191351963 )
find
とxargs
を使った方法もあります。
find <dirpath> -name <filename> | xargs grep <pattern>
以下では、find
、grep
、そしてxarg
についての簡単な解説をします。
find
検索コマンド。
指定したディレクトリ配下を再帰的に検索する。
# 基本形
find <dirpath> -name <name>
# 例
find ~/ -name *.py # HOMEディレクトリ以下の.pyファイルを検索
他にも、ファイルサイズとかで検索可能だが説明は割愛。
grep
ファイルの中を検索するコマンド。
# 基本形
grep <pattern> <path> # patternは正規表現を使用可能。
# 例
grep pd.read_csv *.py # カレントディレクトリに存在する.pyファイルについて、pd.read_csvを検索
grep pd.read_csv ./work_directory/src # 指定したディレクトリに存在するファイルについて、pd.read_csvを検索
拡張子を指定しつつ、ディレクトリ内を再帰的に検索したいとき
grep
では、拡張子を指定しつつ、ディレクトリ内を再帰的に検索することはできません。
しかし、拡張子を指定しながらgrepしたいということは頻繁にあります。
そこで、xargs
を利用します。
# 基本形
find <dirpath> -name <filename> | xargs grep <pattern>
# 例
find ./work_directory/src -name "*.py" | xargs grep pd.read_csv # 指定したディレクトリ以下の.pyファイルについて、pd.read_csvを検索する
まとめ
grep <pattern> --include=<filename> -r
find <dirpath> -name <filename> | xargs grep <pattern>
を覚えて帰ろう。