INODEVLOG

WEBアプリ開発・事業開発・ビジネスモデル・読書の情報などをお届けしています。

開発効率化!指定ファイルをfind&grepするシェルスクリプト例

WEBエンジニアの人で grep とかのコマンドを使ってない人はいないと思います。

ただRailsなどのフレームワーク上で $ grep -r hoge . なんて風に使うと、.git/ 配下のコミット情報や *.log などのログ系のファイルなんかも引っかかってずらずら表示されるのでウザいですよね〜。

今回は拡張子を指定して検索出来るコマンドを昔作ってたものに手を加えたので紹介してみます。

開発者の人は同じようなaliasやshellコマンドを自分で書いてる人も多いと思いますが、もしよかったら参考に自作コマンドを作ってみて下さい。

f:id:inodev:20171019212900j:plain

【初心者向け】コマンドファイルの用意の仕方

一応前提知識が無い方向けに使い方も書いておきます。

  1. 下記Gistソースをコピペorダウンロードして格納しよう
    • gistは拡張子で色付けされるので .sh 付けてるけど短い名前で且つ既存のコマンドにかぶらないようにリネームして下さい。
    • 格納場所は ~/bin とかのディレクトリで良いと思う。なければ $ mkdir ~/bin しよう。
    • Windows?シラネ。
  2. PATHを通しておいて下さい
    • コマンドを探しに行ってくれる場所を表す環境変数のPATHに~/binを追加しよう。
    • 現状のPATHの状態は $ env | grep PATH とかで確認できます。
    • bash使いの人は ~/.bashrc にでも export PATH="$HOME/bin:$PATH" とか書いておけばOKです。
  3. 実行権限を与えよう
    • 該当ファイル名が ~/bin/sch なら $ chmod +x ~/bin/sch とかで実行権限をあげよう。
    • これでファイルの場所を指定しなくても $ sch ~~~ のようにコマンドとして指定出来る様になります。
  4. ターミナル(shell)を再起動しよう
  5. 使ってみてね

シェルスクリプトの内容

なんだかキレイに見える気がするのでGistにあげてみました。

findで拡張子を指定してgrepするコマンド

ファイルを指定する検索コマンドの使用方法

ファイルを ~/bin/sch として保存している場合、

$ sch hoge erb

とすると末尾が erb 拡張子のファイル内に hoge が記載されている箇所をコマンドラインに出してくれます。

$ sch hoge erb slim

というように複数ファイルの指定も可能。

$ sch hoge

で使用するとデフォルトのファイル

(上記ファイルで言うところの DEFAULT_FILES="html erb slim haml css scss sass js coffee rb yml" の部分)

が対象になります。

実装方法のポイント

基本的にパラメータに応じてfindしてgrepしているだけですが下記のポイントは良いかもしれません。

grepの--color=alwaysオプションで見やすい

grepの検索結果をターミナル上で色付きで表示させるのが --color=always オプションです。

普段は --color=auto にしている人だとgrep結果は色がつかないかと思いますが、こういったコマンドだけでも色を付けておくと見やすいかも。

ちなみに 環境変数の GREP_OPTIONS に以下のように設定しておくと常に色付きとかに出来るようなので自分は設定しています。

export GREP_OPTIONS="--binary-files=without-match --color=auto"

参考: grep の 環境変数 GREP_OPTIONS - 技術メモ帳

bashでもzshでも使える

普段はzsh使っているんですが、bashとzshではShellScriptの配列の扱いなどが結構違います…。

特にパラメータの扱い方やfor文での分割ループの回し方などに差がある為、今回はあえて set でデフォルトの挙動をするようにパラメータ群を追加したり、for文ではなくwhile文を使って順次パラメータを取り出すことでzshでもbashでも動くようになってます。

参考: 位置パラメーターの一括展開 $* $@ "$*" "$@" の違いを知れ!! - Shell Script Advent Calendar 2016 - ダメ出し Blog

その他、

「自分はこういうの使ってるよ!」とか

「こういう場合どうしてる?」とか

「無知乙!ここはこうした方がいいゼ!」

みたいなのあれば個別にメッセージとか頂ければ幸いです( ・`ω・´)