2015年7月10日金曜日

ファイルリスト作成のTips

けっこうな数のフォルダに散らばっている特定のファイルのリストを作成する場合、
コマンドプロンプトを使用すると手軽にリストを作成できます。


エクスプローラのアドレスバーへcmdと入力して[Enter]


すると、開いているフォルダへのパスが通った状態でコマンドプロンプトが開きます。

そこで、

dir /s /b *.tga>tgaList.txt


と入力。

すると、開いているフォルダにtgaList.txtが作られ、中身にはフルパスな
.tgaファイルのリストが記述されています。

mayabatchに送るためのmayaファイルのリストをつくったりするのにも便利。

dir /s /b chara???.ma>maList.txt



とかだと、特定のファイル名に絞込んだ状態のリストにすることも可能。

dirの結果をfindに送って、更に詳細な絞込みを行うと、テキストエディタの
置換処理の数を減らせます。


他にも、例えば、ファイルのサイズやタイムスタンプが欲しい場合、

dir /s /-c *.tga|find ".tga">tgaTimeStamp.txt



みたいにすると、あっという間に必要な情報を取得可能。
詳細表示をメモる必要はありません。



しかし、コマンドプロンプトって、Windows10でも使えるのかなぁ・・・
PowerShellに移行になってしまうのだろうか?



2015年7月3日金曜日

findコマンドについて

ms-dos、findコマンドのヘルプから
ファイル (複数可) 内のテキスト文字列を検索します。
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "文字列" [[ドライブ:][パス]ファイル名[...]]
  /V        指定した文字列を含まない行をすべて表示します。
  /C        指定した文字列を含む行の数だけを表示します。
  /N        行番号を表示します。
  /I        大文字と小文字の区別をしないで検索します。
  /OFF[LINE] オフライン属性が設定されたファイルをスキップしません。
  "文字列"  検索する文字列を指定します。
  [ドライブ:][パス]ファイル名
            検索するファイル (複数可) を指定します。
パスが指定されていないときは、プロンプトで入力されたテキストまた
は別のコマンドからパイプ処理で渡されたテキストを検索します。


このコマンドを使用すると、なぜか
---------- [[ドライブ:][パス]ファイル名[...]]ヒットした行1ヒットした行2



と出てくる。ハッキリ云って先頭の
---------- [[ドライブ:][パス]ファイル名[...]]
は要らない・・・。

コレを出さないようにするには、

find "文字列" %FILE_NAME% | find "文字列"

とすれば必要な部分だけに整形された。

ただ、ヒットさせた行を fortokens で分割させようとしたときに問題が・・・。

for /f "tokens=1-3" %%a in ('find "文字列" %FILE_NAME% | find "文字列" %FILE_NAME%') do echo %%a %%b %%c

みたいな事はできない。
for /f "tokens=1-3" %%a in ('find "文字列" %FILE_NAME%') do echo %%a %%b %%c

を注意深く観察すると、
  1. ---------- [[ドライブ:][パス]ファイル名[...]]
  2. ヒットした行1
  3. ヒットした行2

のような感じで、行数分ループしていた。
で、1行目だけ要らないので、コメント行扱いにする eol を使用する。
for /f "eol=- tokens=1-3" %%a in ('find "文字列" %FILE_NAME%') do echo %%a %%b %%c

これで無事 find でヒットした行をtokenizeさせることができた。