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でもプロットしてみる