プログラムでおかえしできるかな

Python、フェイジョア、日常のあれこれでお返し、元SEの隠居生活。

ファイル内文字列検索アプリfind-us-str【フリー】

このエントリーをはてなブックマークに追加

find-us-str は、Windows 環境で文字コードが UTF-8 のテキストファイルを対象に文字列を検索します。
コマンドプロンプトで実行し、結果を標準出力します。
文字コードが Shift-JIS のファイルと混在していても両方とも検索できます。
大文字・小文字の一致、正規表現、サブフォルダの検索、除外するフォルダの指定、含めるフォルダの指定ができます。

▽アプリの画面

Pythonで作成 アプリの作成方法はこちらの記事で紹介しています。
📖 ファイル内文字列検索アプリの作り方【Python】 🔗
目次

◆特徴

Windows の findstr や Linux の grep と同じようにテキストファイル内の文字列を検索し結果を標準出力します。
一番の特徴は、文字コードが UTF-8 のファイルでも検索できることです。

【特徴】

  • テキストファイル内の文字列を検索します
  • 文字コードが UTF-8 と Shift-JIS のテキストファイルを対象にします
    混在していても大丈夫です
  • ワイルドカードでファイル名を指定できます
  • サブフォルダを含めて検索するか指定できます
  • 検索から除外するサブフォルダを指定できます
  • 検索に含めるサブフォルダを指定できます
  • 検索文字、サブフォルダの指定に正規表現を使用できます
  • 検索文字の大文字小文字を区別するか指定できます
  • 一致した行を行番号とともに出力します
  • コマンドプロンプト上で動作します

◆使い方

コマンドプロンプトを起動してからコマンドとして実行します。

※実行開始までに少々時間がかかります。ご了承ください。

使い方
find-us-str.exe [-h] [-s] [-i] [-r] [--exclude_dir dir] [--include_dir dir] keyword target_path


位置引数 説明
keyword 検索文字列
空白や「|」などを含む場合はダブルクォーテーションで括る
target_path 検索対象パス(ファイルorフォルダorワイルドカード)
例:test.txtsrcsrc\*.py

検索対象パスは、相対パス、絶対パスのどちらでも指定できます。
検索対象パスにファイル名を指定した場合、そのファイル内を検索します。
検索対象パスにフォルダ名を指定した場合、そのフォルダ内のすべてのファイル内を検索します。
ワイルドカードはファイル名部分に指定できます。

  • ワイルドカード文字
    • * :任意の文字0以上
    • ? :任意の文字1文字
    • []:カッコ内の文字列のどれか一文字(-で範囲指定可)
オプション 説明
-s, --subdir サブフォルダも検索
-i, --ignore_case 大文字小文字を同一視
-r, --regx 正規表現を使用
対象:検索文字列、除外するフォルダ、含めるフォルダ
--exclude_dir dir 除外するフォルダ
--include_dir dir 含めるフォルダ
-p, --plain_text 装飾しない出力
リダイレクトでファイル出力する場合などに使用
-h, --help ヘルプを表示

正規表現について

正規表現は Python の機能をそのまま使用しています。
記述方法はこちらで確認してください:re --- 正規表現操作 — Python 3.13.2 ドキュメント

◆使用例

簡単な使用例を紹介します。

本アプリはテキストファイルとして読み込めなかったファイルは読み飛ばします。

◇一般の方向け

ブログの内容を検索する場合を想定して例を紹介します。

正規表現を使用した例も紹介しますが、ここでの正規表現の使い方は決まり事として受け止めてください。

何を検索 書き方/説明
「Spotify」を find-us-str Spotify .
カレントディレクトリの全ファイルを対象に文字列を検索
ピリオドはカレントディレクトリを示します
「Spotify」または「spotify」を find-us-str spotify . -i
カレントディレクトリの全ファイルを対象に文字列を大文字小文字区別せずに検索
「Spotify」または「spotify」を find-us-str spotify *.txt -i
カレントディレクトリのtxtファイルを対象に文字列を大文字小文字区別せずに検索
「2024年2月」または
「2024年2月」を
find-us-str "2024年2月|2024年2月" . -r
複数の文字列のどちらかを含むものを検索
正規表現を使用:-r、「|」が特殊文字なので「"」で括る 1
「2024年2月」または
「2024年2月」を
find-us-str "2024年[22]月" . -r
複数の文字列のどちらかを含むものを検索(上記と同じ結果)
正規表現を使用:-r、「[]」で囲った文字のいずれかで一致
「ダンゴムシ」を find-us-str ダンゴムシ .
カレントディレクトリの全ファイルを対象に文字列を検索
「ダンゴムシ~強い」を find-us-str "ダンゴムシ.*強い" . -r
カレントディレクトリの全ファイルを対象に二つの文字列を検索
正規表現を使用:-r、「.*」で「~」を表現しています
「リシマキア ミッド」を find-us-str "リシマキア ミッド" .
空白を含む文字列を検索するには「"」で括ります

◇技術者向け

Python で仮想環境を構築した複数プロジェクトが存在する環境での検索を想定して例を紹介します。

仮想環境にインポートしたライブラリを除外したいときなどのために、
除外するフォルダの指定などいくつかのオプションを設けました。

ケース 書き方/説明
全てのサブフォルダを検索 find-us-str "from pywinauto" *.py -s
オプション -s を使用
指定したサブフォルダを除外して検索 find-us-str "from pywinauto" *.py -s -r --exclude_dir \..+
ピリオドで始まるサブフォルダを除外(例えば.venv.vscodeなど)
指定したサブフォルダだけを検索 find-us-str "from pywinauto" *.py -s --include_dir tests
tests フォルダを含む
指定したサブフォルダを除外して
さらに別に指定したサブフォルダだけ検索
find-us-str "from pywinauto" *.py -s -r --exclude_dir \..+ --include_dir tests
ピリオドで始まるサブフォルダを除外、tests フォルダを含む
例えば自分で書いたテストコードだけ検索したいとき
フォルダ内を検索し結果をファイルに保存 find-us-str "from pywinauto" *.py -p > result.txt
オプション -p を使用。
エスケープシーケンスが出力されないので再利用しやすい

◆出力例

出力例を示します。
出力結果には、まずオプションの内容が表示されます。
その後、指定した文字列を含むファイル名を下線付きで出力します。
続けて一致した行を行番号付きで一致した文字列に色を付けて出力します。

◆アプリの取得と準備

アプリを含んだ zip ファイルを下記からダウンロードして取得します。
ダウンロードした zip ファイルを解凍すると次のファイルができます。
任意のフォルダにファイルを保存してください。
 ※パスの通っているフォルダに保存すると使いやすくなります

◇動作環境

  • Windows 64ビット OS

◇更新情報

  • 1.0.1:2025-03-01:リダイレクトで出力したときのエンコードエラーを回避
  • 1.0.0:2025-02-28:初期リリース

更新:2025-03-01

◆さいごに

Windows で複数ファイルに対して文字列検索したいときがあります。
Windows のコマンドに findstr があって時々使用します。
findstr は文字コードが Shift-JIS のファイルだけを対象にしています。
今は、Python プログラムのソースコードやブログの下書き用ローカルファイルなど、
文字コードを UTF-8 にするほうが扱いやすいものが多いです。

UTF-8 のファイルを検索できるフリーソフトを探してみたのですが、多機能なものが多いので findstr に近いものを作ってみました。

単に複数ファイル内の文字列検索というだけでなく、プログラムの開発環境でも検索しやすいようにオプションを用意しました。

例えば、Python の仮想環境用のフォルダを除外して検索できます。
検索ができても余計な結果ばかりでは使えません。
そのうえ、除外フォルダの指定には正規表現も使えます。

ファイル名があやふやなテキストファイルを探すのにも使えるかもしれません。


あわせて読みたい 📖 CSV viewerアプリの作り方(ドラッグアンドドロップ)【Python】 🔗

◇免責事項

ご利用に際しては、『免責事項』をご確認ください。
お気づきの点がございましたら『お問い合わせ』からお問い合わせください。

投稿: 、更新:

  1. |」は Windows のコマンドプロンプトで複数コマンドを連続して実施する意味になるので文字列の一部となるように「"」で括ります