February 15, 2014

サブディレクトリも含むディレクトリ一覧を取得する方法

Windowsのコマンドプロンプトで、サブディレクトリも含むディレクトリ(だけ)の一覧を取得する方法です。

C:\>dir /b /s /a:d [対象ディレクトリ]
  *dirのスイッチの詳細は、 dir /? で確認出来ます。
 たとえば、以下のようなディレクトリ構成のものがあったとします。(赤字がディレクトリです)
C:\>tree /f c:\test
フォルダー パスの一覧:  ボリューム ボリューム
ボリューム シリアル番号は xxxx-xxxx です
C:\TEST
├─1_foo
│  │  1_foo.txt
│  │
│  ├─1_foo
│  │      1_foo.txt
│  │      2_bar.txt
│  │      3_baz.txt
│  │    
│  ├─2_bar
│  │      3_baz.txt
│  │    
│  └─3_baz
│          2_bar.txt
│        
├─2_bar
│  └─3_baz
│          2_bar.txt
│        
└─3_baz
    │  1_foo.txt
    │
    └─2_bar
これに対して前述のコマンドを実行してみると
C:\>dir /b /s /a:d c:\test
C:\test\1_foo
C:\test\2_bar
C:\test\3_baz
C:\test\1_foo\1_foo
C:\test\1_foo\2_bar
C:\test\1_foo\3_baz
C:\test\2_bar\3_baz
C:\test\3_baz\2_bar
となります。
これだけだと、使い道はあまりないんですが、ディレクトリ指定が可能な(でもサブディレクトリまでは見てくれない)何かのツールを自動で実行したい場合に、上記の出力をパラメータとして渡してあげれば、dirコマンドで一番上の階層のディレクトリを一つ指定するだけで、そのディレクトリ以下のサブディレクトリまで全て実行してくれます。
たとえば、前述したディレクトリ構成の中のtxtファイルの拡張子をlogに変えたい場合は
@echo off
for /f "delims=" %%a in ('dir /b /s /a:d %1') do (
  if exist %%a\*.txt (
    rename %%a\*.txt *.log
  )
)
というバッチファイル(ここではhogehoge.bat)を作って、バッチファイルの引数に対象ディレクトリを渡してあげれば
C:\>hogehoge.bat c:\test
C:\>tree /f c:\test
フォルダー パスの一覧:  ボリューム ボリューム
ボリューム シリアル番号は xxxx-xxxx です
C:\TEST
├─1_foo
│  │  1_foo.log
│  │
│  ├─1_foo
│  │      1_foo.log
│  │      2_bar.log
│  │      3_baz.log
│  │
│  ├─2_bar
│  │      3_baz.log
│  │
│  └─3_baz
│          2_bar.log

├─2_bar
│  └─3_baz
│          2_bar.log

└─3_baz
    │  1_foo.log
    │
    └─2_bar
といった感じに、一度で全て.logに変わります。
renameコマンドのところを好きな処理に変えることで、サブディレクトリに対応していないツールでも1回起動するだけでOKになる…はずですw

1 comment:

  1. Casino Game | Dr.MCD
    The casino 김제 출장안마 game is played with a 서산 출장샵 fixed minimum bet. If the minimum bet is less than the bet you have to keep winning. No games. No payouts. The more 보령 출장마사지 games 태백 출장샵 you make 아산 출장샵

    ReplyDelete