前回の記事はこちら: http://qiita.com/superriver/items/f61a609150bfdd98a27a
思ったより読んでくれた人がいたので、続きを書きます。
ディレクトリのみを検索して表示
UNIXの場合はfind
を使いますよね。こんな感じ
$ find /home/user -type d -print
Windowsではdir
を使います。
C> dir /ad \home\user
これだと \home\user 直下にあるディレクトリの一覧を表示します。なのでfind
とは挙動が違いますね。find
と同じく\home\user以下のサブディレクトリを全探索するには前回紹介した/s
オプションを追加すればOKです。
C> dir /ad/s \home\user
/ad
と/s
の間はスペースを空けても空けなくても構いません。/b
オプション(これも前回紹介しました)を加えると、表示が完全にfind
と同じになります。
C> dir /ad /s /b \home\user
おまけですが、以下のようにすると\home\user以下にある、名前にdataを含むディレクトリをすべて表示します。
C> dir /ad/s/b \home\user\*data*
これをfind
で書くときって-type
と-name
の両方を指定しなきゃならないし、ワイルドカードをバックスラッシュでエスケープしなきゃならなくて、結構めんどくさいんです。これはWindowsの方が簡単に書けます。
$ find /home/user -name \*data\* -type d -print
ただパターン表記そのものはUNIXのシェルの方が強力です。Windowsではワイルドカード(*
か?
)しか使えないので、正規表現(たとえば[a-e]*
みたいなこと)は使えません。まあdirとfindstr組み合わせればできるんですけど、まあ一長一短です。
ファイル名補完
現代のUNIXシェルと同じくTABキーでファイル名補完できます(「現代の」と書いたのは、昔のcshだとESCキーで補完だったからです。豆ね)。ワイルドカードも認識してくれます。
C> notepad ho[TAB]
これでhoで始まるファイル名を補完してくれます。zshのような一覧表示はなく、TABキーを押すごとに候補を順番に表示します。
ファイル名がtxt
で終わるファイル名を順番に補完するにはワイルドカードを使います。
C> notepad *txt[TAB]
自分がよくやるのはVisual Studioを開くとき、カレントディレクトリにあるsln
ファイルで起動する方法です。
C> *sln[TAB][ENTER]
ちなみにTABキーの代わりにCtrl-I
をタイプしても同じです。基本ですね。ENTERもCtrl-M
で代用できます(Ctrl-J
は利かない)。UNIXユーザとしてはホームポジションから手を離したくないでしょうし、ご存じでなかった方はぜひご活用ください。
findstrがgrep/egrepの代わり
findstr
は自分的には最も頻繁に使うコマンドの一つです。grep
の代わりなので当然といえば当然ですが。
grep
と同じくファイル群/標準入力から特定の文字列(正規表現含む)を探すのが基本的な使い方ですが、入力ファイルの指定方法がgrep
より少しリッチです。
基本的な検索
例えば「カレントディレクトリ以下にあるすべての.php
ファイルからhoge
を含む行をすべて表示する」にはこうします。
C> findstr /s hoge *.php
/i
スイッチを追加すると大文字小文字の区別なく検索します。
C> findstr /si hoge *.php
/s
スイッチと/i
スイッチはまとめて/si
のように指定できます。
-vに対応するのは/vスイッチ
hoge
を含まない行をすべて表示するのはUNIXと同じくvオプションです。
C> findstr /v hoge *.php
意図的に同じオプションになっているので覚えやすくていいですよね。
正規表現による検索
正規表現は/r
を指定した場合のみに有効になります。
C> findstr /r "^[0-9a-f]" *.txt
ハット記号(^
)はCMDではエスケープ文字なので、使う時はダブルクォーテーションで囲ってください。
リテラル検索
ワイルドカード文字を含んだ文字列を検索したいときは/c
です。
/help使ってね
他にもオプションが沢山あるので、ぜひヘルプを一度ご覧ください。
C> findstr /help
おまけ
Windows APIは、実はMS-DOSの頃からUNIX同様フォワードスラッシュ(/
のことです)もディレクトリの区切り文字として認識しています。なのでファイル名にはスラッシュが使えません。
普段パス名にスラッシュが使えないのは単にCMDの制約によるものです(オプション名の指定にスラッシュ使っちゃったから...)
でもいつの間にかcd
コマンドだけはスラッシュを受け付けるようになってます。
C> cd /users/hoge/downloads
これちゃんとカレントディレクトリを切り替えてくれるんですよ。でもTABキーの補完は利かないし、/d
オプションを指定した場合はエラーになっちゃうんですけどね。。。