プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Windows、バッチファイル(.bat)で、フォルダ内のすべてのテキストファイル(.txt)を再帰的に取得し、ファイル名と行数を表示する
結論から書けば

@echo off

for /f "usebackq" %%i in (`dir /B /S *.txt`) do (
    SET /P<NUL=%%i:
    type %%i | find /C /V ""
)

pause

で取得できます。

それでは詳細を書いていきます。

ちょっくら、ファイル内の行数を取得する必要に迫られましてね。
ファイルがたくさんあったので、バッチファイルでまとめて処理しようと考えたのです。

ちなみに今回の要件はこんな感じφ(--)

1.テキストファイル内の行数を取得する(空白行含む)
2.テキストファイルの拡張子はすべて「.txt」
3.テキストファイル名に規則性は無し
4.サブディレクトリの中にもテキストファイルがあり、それらをすべて取得する必要あり

ほんで、あれやこれやと頑張って、できあがったのがこちらφ(--)

@echo off

for /f "usebackq" %%i in (`dir /B /S *.txt`) do (
    SET /P<NUL=%%i:
    type %%i | find /C /V ""
)

pause

順番に見ていきましょう。

for /f "usebackq" %%i in (`dir /B /S *.txt`) do (~)

のfor文で「dir」コマンドの実行結果を一行ずつ変数「%%i」に突っ込んでいます。
for文の中の

dir /B /S *.txt

がファイル一覧を取得している部分です。
オプション「/B」がファイル名のみを表示(見出しや要約が付かない)するためのオプション、
オプション「/S」がサブディレクトリ内も再帰的に探すオプションです。
「*.txt」を指定しているので、検索結果に引っかかるのは、拡張子が「.txt」だけのファイルになります。
つまり、この記述で

サブディレクトリの中も含め、拡張子が.txtのファイル名のみを取得

できるのです。

次にfor文の中を見てみましょう。
最初の

SET /P<NUL=%%i:

でファイル名を表示しています。
後ろの「:」は特に意味はありません。
表示上の、ファイル名と行数の区切り文字として使っています。

ファイル名を表示するのにechoを使っていないのは、echoは末尾に改行が付くからです。
「SET /P」を使うことで、改行しないechoっぽいことができます。

その次の行の

type %%i | find /C /V ""

では、ファイル内の行数を取得して表示しています。

注意点として、ファイル内の行数を取得する場合は

type [ファイル名] | find /C /V ""

で取得してください。
単に

find /C /V "" [ファイル名]

としてしまうと、末尾の空行をきちんとカウントできません。
例えば、

■test.txt
1(改行)
2(改行)
3(改行)
(改行)

というテキストファイルがあった際に、

type test.txt | find /C /V ""

の実行結果が「4」になるのに対し

find /C /V "" test.txt

の実行結果は「3」になります。

そんなところですね。

処理の最後に付いている「pause」は、動作確認のための記述です。
実際には「pause」を取っ払って、実行結果をファイルにリダイレクトする形で取得しています。

このバッチファイルを実行したところ、私の環境では以下のような結果が表示されましたφ(--)

C:\test\test.txt:5
C:\test\test2.txt:3
C:\test\dir1\test1_1.txt:1
C:\test\dir2\test2_1.txt:0
C:\test\dir1\dir11\test1_1_1.txt:13
C:\test\dir1\dir12\test1_2_1.txt:4321
C:\test\dir1\dir13\test1_3_1.txt:62
C:\test\dir1\dir13\test1_3_2.txt:96
続行するには何かキーを押してください . . .

おぉ、バッチリヾ(*´ェ`*)ノ
無事に、一括でテキストファイルの行数を取得することができました。

最後にもう一度、まとめて書いておきますねφ(--)

@echo off

REM 拡張子「.txt」のファイル名一覧を取得(サブディレクトリの中も再帰的に取得)
for /f "usebackq" %%i in (`dir /B /S *.txt`) do (

    REM ファイル名出力
    SET /P<NUL=%%i:

    REM 行数出力
    type %%i | find /C /V ""
)

REM 動作確認用
pause

ってなところで、フォルダ内のすべてのテキストファイル(.txt)を再帰的に取得し、
ファイル名と行数を表示するバッチファイル(.bat)の作成、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:コマンド/バッチ  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事