[bash] ToDoコメントを一括で抽出する方法

2 min read

背景

長年運用されたシステムのソースコードから、ToDoコメントを抽出する必要があった。

ソースコードはフロントエンドのソースで、JSDoc形式でコメントが記述されている。

仕様

  1. 検索する文字列
    JSDocからToDoコメントを検索するので@todo が検索できるようにする。ただし、表記ゆれを考慮しtodoは大文字小文字を区別しない。
  2. 検索対象
    指定されたディレクトリ内の全てのファイルを検索する。
    ただし、node_modulesディレクトリは除外する。
  3. 出力フォーマット
    出力される各行は、以下の形式で出力する。
    • ファイル名: - [ ] ファイルパス
      • ToDoコメント: - [ ] todo: コメントの内容

実装

#!/bin/bash

search_dir="."
search_string="@todo"

find "$search_dir" -type d -name "node_modules" -prune -o -type f -print | while read -r file; do
    if grep -iq "$search_string" "$file"; then
        echo "- [ ] $file"
        grep -in "$search_string" "$file" | awk -F: '{print "  - [ ] todo: " $2}'
    fi
done

上記を実行することで、以下のような出力が得られる。

- [ ] ./next/src/compiled/react-dom/cjs/react-dom.production.js
  - [ ] todo: // @TODO refactor this block to create the instance here in complete
- [ ] ./next/src/compiled/react-dom/cjs/react-dom-server.edge.production.js
  - [ ] todo: // @TODO add bootstrap script to implicit preloads
  - [ ] todo: // @TODO refactor text separators so we don't have to defensively add
- [ ] ./next/src/compiled/react-dom/cjs/react-dom.profiling.js
  - [ ] todo: // @TODO refactor this block to create the instance here in complete
- [ ] ./next/src/compiled/react-dom/cjs/react-dom-server.bun.production.js
  - [ ] todo: // @TODO add bootstrap script to implicit preloads
  - [ ] todo: // @TODO refactor text separators so we don't have to defensively add