コマンドプロンプト上で「*.[ch]」の代替を模索する

これは間違いなくバッドノウハウ

問題

あるディレクトリにC言語のソースファイルとヘッダファイルを含む数種類の複数のファイルが置いてある。そのソースファイルとヘッダファイルに対して、あるキーワードでegrepしたくなった。

Linux上なんかでbash等のシェルを使っているなら、例えばこんな感じで済むだろう。

egrep -n -i hoge *.[ch]

Windowsコマンドプロンプト上ではどうか? GnuWin32など、Unix由来のツールはある程度インストール済みだとする。但しechoなどの同名のコマンドがある場合、コマンドプロンプト標準のコマンドが優先される環境だ。

最初に思いついたのは、こんな感じだ。

egrep -n -i hoge *.c *.h

この方法でも十分といえば十分なのだが、結果がファイル名順にソートされないのが気になる。必ず「ソースファイル -> ヘッダファイル」の順になってしまう。

という訳で、ソースファイルとヘッダファイルを含めたファイル名順で出力されるようにしたい。

解答

出力結果をソートする方法は少し面倒そうだったので、「ファイル名順にegrepを実行する」という方向で考えてみた。

最初の案はこんな感じ。

dir /b *.c *.h | sort | xargs egrep -n -i hoge

その後でsortを使わなくても済むことに気づいて変更したのがこれ。

dir /b /o:n *.c *.h | xargs egrep -n -i hoge

どう見ても力技の一歩手前だが、意図したとおりの出力が得られる。コマンドが長くなってしまう点が気に入らないのだが、我慢している。