2014.
10.
01
13:49:45
結論から書けば
で取得できます。
それでは詳細を書いていきます。
ちょっくら、ファイル内の行数を取得する必要に迫られましてね。
ファイルがたくさんあったので、バッチファイルでまとめて処理しようと考えたのです。
ちなみに今回の要件はこんな感じφ(--)
ほんで、あれやこれやと頑張って、できあがったのがこちらφ(--)
順番に見ていきましょう。
のfor文で「dir」コマンドの実行結果を一行ずつ変数「%%i」に突っ込んでいます。
for文の中の
がファイル一覧を取得している部分です。
オプション「/B」がファイル名のみを表示(見出しや要約が付かない)するためのオプション、
オプション「/S」がサブディレクトリ内も再帰的に探すオプションです。
「*.txt」を指定しているので、検索結果に引っかかるのは、拡張子が「.txt」だけのファイルになります。
つまり、この記述で
サブディレクトリの中も含め、拡張子が.txtのファイル名のみを取得
できるのです。
次にfor文の中を見てみましょう。
最初の
でファイル名を表示しています。
後ろの「:」は特に意味はありません。
表示上の、ファイル名と行数の区切り文字として使っています。
ファイル名を表示するのにechoを使っていないのは、echoは末尾に改行が付くからです。
「SET /P」を使うことで、改行しないechoっぽいことができます。
その次の行の
では、ファイル内の行数を取得して表示しています。
注意点として、ファイル内の行数を取得する場合は
で取得してください。
単に
としてしまうと、末尾の空行をきちんとカウントできません。
例えば、
■test.txt
というテキストファイルがあった際に、
の実行結果が「4」になるのに対し
の実行結果は「3」になります。
そんなところですね。
処理の最後に付いている「pause」は、動作確認のための記述です。
実際には「pause」を取っ払って、実行結果をファイルにリダイレクトする形で取得しています。
このバッチファイルを実行したところ、私の環境では以下のような結果が表示されましたφ(--)
おぉ、バッチリヾ(*´ェ`*)ノ
無事に、一括でテキストファイルの行数を取得することができました。
最後にもう一度、まとめて書いておきますねφ(--)
ってなところで、フォルダ内のすべてのテキストファイル(.txt)を再帰的に取得し、
ファイル名と行数を表示するバッチファイル(.bat)の作成、完了\(--)/
@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 (
SET /P<NUL=%%i:
type %%i | find /C /V ""
)
pause
で取得できます。
それでは詳細を書いていきます。
ちょっくら、ファイル内の行数を取得する必要に迫られましてね。
ファイルがたくさんあったので、バッチファイルでまとめて処理しようと考えたのです。
ちなみに今回の要件はこんな感じφ(--)
1.テキストファイル内の行数を取得する(空白行含む)
2.テキストファイルの拡張子はすべて「.txt」
3.テキストファイル名に規則性は無し
4.サブディレクトリの中にもテキストファイルがあり、それらをすべて取得する必要あり
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 (
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(改行)
(改行)
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
続行するには何かキーを押してください . . .
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
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)の作成、完了\(--)/