コンテンツにスキップ

2025年度

25/10/09 進捗報告

簡単に検索を行えるようにする

引数で与えた文字列を、配下のディレクトリを再帰的にたどって .py.ipynb だけから検索する POSIX シェルスクリプトを用意しました。.ipynb は JSON ですがテキスト扱い(-a)で中身を検索します。.git.ipynb_checkpoints などは除外します。

#!/usr/bin/env sh
# search_code.sh
# 使い方:
#   ./search_code.sh "検索文字列" [検索開始ディレクトリ]
# 例:
#   ./search_code.sh "redshift_method1" .
#   ./search_code.sh "redshift_method1" /path/to/project

set -eu

if [ $# -lt 1 ] || [ $# -gt 2 ]; then
  echo "Usage: $0 \"PATTERN\" [DIR]" >&2
  exit 2
fi

PATTERN=$1
START_DIR=${2:-.}

# 見つけたファイルを NUL 区切りで受け取り、安全に grep に渡す
# - type f: 通常ファイルのみ
# - name: .py と .ipynb のみ
# - prune: 除外したいディレクトリ
# - print0 / -0: NUL 区切り
# grep オプション:
#   -n  : 行番号表示
#   -H  : ファイル名常に表示
#   -F  : 固定文字列(正規表現でなくリテラル検索)
#   -a  : バイナリ判定でもテキストとして扱う(.ipynb 対策)
#   --color=always : 目視しやすく(不要なら削除可)
#   -- はパターンがハイフンで始まる場合の安全策
find "$START_DIR" \
  -type d \( -name .git -o -name .hg -o -name .svn -o -name .venv -o -name .mypy_cache -o -name __pycache__ -o -name .ipynb_checkpoints \) -prune -false -o \
  -type f \( -name "*.py" -o -name "*.ipynb" \) -print0 \
| xargs -0 grep -nH -F -a --color=always -- "$PATTERN" || {
  # grep が 1 を返すのは「ヒットなし」の意味なので、メッセージだけ出して 1 で終了
  status=$?
  if [ "$status" -eq 1 ]; then
    echo "No matches for: $PATTERN" >&2
  fi
  exit "$status"
}

使い方

chmod +x search_code.sh
./search_code.sh "redshift_method1" .

メモ

  • 大文字小文字を無視したい場合は grep-i を足してください(... grep -niH -F -a ...)。
  • より高速な ripgrep (rg) が入っているなら、以下のワンライナーでも OK です(同等フィルタ、.ipynb も検索):

    rg -n --fixed-strings -S --hidden \
       -g '!**/.git/**' -g '!**/.ipynb_checkpoints/**' \
       -g '*.py' -g '*.ipynb' \
       "redshift_method1" .
    

    -S は大小文字を区別、-i で無視、に変更できます。

RGM

  • gas surface density / gas+stellar surface densityでもプロットしてみる