新規記事の投稿を行うことで、非表示にすることが可能です。
2020年09月05日
"シェル芸" 〜 大量のテキストファイルの行数を一発でカウントする方法 〜 【Windows コマンドプロンプト編】
【 はじめに 】
こんにちは。田中パスタです。
このブログは、就職氷河期世代の量産型プログラマである私(ワタクシ)が、ブログ・アフィリエイト・SEOについての見識を深めるべく個人的に利用させて頂く実験部屋でございます。
”シェル芸”とは、主にLinuxなどのUNIX系OS上で、あらゆる処理をコマンド入力一発で華麗に終わらせる芸当のこと、そしてその技を繰り出す人々のことを”シェル芸人”と呼ぶのだそうです。
まさにCUI界の”ワンパンマン”と言ったところでしょうか。
参考:シェル芸 - フリー百科事典『ウィキペディア(Wikipedia)』
参考:CUI(キャラクタユーザインタフェース) - フリー百科事典『ウィキペディア(Wikipedia)』
OSをWindows に置き換えてみると、次のようなことが言えそうです。
- コマンドプロンプト画面で、コマンド入力一発で目的の処理を完結させる
- 1行のコマンド、1回の実行で全てを終わらせる
- アプリケーションソフトなどの外部ツールは利用しない
- バッチファイルも作らない
私(ワタクシ)もプログラマのはしくれ、ちょっとこれに挑戦してみたいと思います。なお、当ブログに掲載のコマンドを実行される場合はあくまで自己責任でお願い致します。
【 大量のテキストファイルの行数を一発でカウントする 】
【目次】
【 コマンドの機能説明 】
1つのフォルダを指定して、その中、及びサブフォルダの中にある全てのテキストファイル(※拡張子が.txtのファイル)の行数をカウントして画面に結果を出力します。
出力結果は 『 [フルパスのファイル名] , [行数] <改行> 』 のようにして、カンマ区切りのCSV形式で一覧表示します。
【 コマンドの実行結果 】
例えば次のようにテキストファイルが6つ存在するとき、
C:\Temp
│ aaa.txt
│ bbb.txt
│ ccc.txt
│
└─ddd
eee.txt
fff.txt
ggg.txt
コマンドの実行結果はこうなります。
c:\Temp\aaa.txt,5
c:\Temp\bbb.txt,8
c:\Temp\ccc.txt,4
c:\Temp\ddd\eee.txt,9
c:\Temp\ddd\fff.txt,6
c:\Temp\ddd\ggg.txt,13
【 コマンドの実行環境 】
Windows10のコマンドプロンプト
【 コマンドの使い方 】
@ [スタートボタン] → [Windows システムツール] → [コマンドプロンプト] を選択して、コマンドプロンプト画面を起動する。
A 下記の一発コマンドの "c:\ほげほげ" の部分に、あなたが調べたいフォルダ名をフルパスで入力する。
B コマンドを実行する。(エンターキー ッターン!!)
【 一発コマンド 】
【GitHubGist】
※【補足】テキストファイルの最終行が改行のみの空行だった場合は、最終行をカウントに入れません。
【 出力結果をファイルに保存する場合はこちら 】
【GitHubGist】
※【補足】"c:\ほげほげ\結果.csv"には、出力したいファイル名のフルパスを入力してください。
【 コマンドの解説 】
コマンドの先頭と末尾の部分、pushdとpopdは、カレントディレクトリをコマンドを実行している間だけ一時的に移動させるために使用しています。なので以下のコマンドを実行しても結果は同じです。
【GitHubGist】
もっとシンプルなコマンドが良い方は、下記のようなコマンドでもだいたい目的を達成しますが、余計な線や改行が入ったり、ファイルパスが全部大文字になったりします。
【GitHubGist】
---------- C:\TEMP\AAA.TXT: 5
---------- C:\TEMP\BBB.TXT: 8
---------- C:\TEMP\CCC.TXT: 4
---------- C:\TEMP\DDD\EEE.TXT: 9
---------- C:\TEMP\DDD\FFF.TXT: 6
---------- C:\TEMP\DDD\GGG.TXT: 13
「@set /p <NUL=%f」の部分はファイルのフルパスを出力する部分です。これを「echo」に置き換えるとシンプルなのですが、それだと出力結果に余計な改行が入ってしまいます。
【GitHubGist】
c:\Temp\aaa.txt,
5
c:\Temp\bbb.txt,
8
c:\Temp\ccc.txt,
4
c:\Temp\ddd\eee.txt,
9
c:\Temp\ddd\fff.txt,
6
c:\Temp\ddd\ggg.txt,
13
【ざっくり解説 ※めんどくさかったら読み飛ばしてね。】
「for /r %f in ("*.txt") do」の部分は、存在するテキストファイルの数だけ、その後に記載されたコマンドを繰り返します。
「/r」のオプションを付けることによって、サブフォルダにあるテキストファイルも対象にします。
「%f」の部分は、do 以降に記載されたコマンドに対してフルパスの情報を変数「%f」に格納して渡します。
なのでdo の後に「@echo %f 」などと記載すると、テキストファイルのフルパスを画面に出力します。
でも実際にはechoを使用すると出力結果に余計な改行が入ってしまうので、ちょっと複雑になっちゃいますが「@set /p <NUL=%f」で代用しています。
尚、「@」は入力されたコマンドそのものを画面に表示しないようにするために使用します。邪魔ですからね。
また「&」は複数のコマンドを順番に実行する場合に使用します。
「find /v /c "" < "%f"」の部分は、一つのテキストファイルの行数を数えて、その行数のみを画面に表示します。
【 さいごに 】
次回はWindows 10に標準搭載の「PowerShell」を使って、今日と同じ処理を一発コマンドで実現してみたいと思います。
最後までご覧いただき、ありがとうございました。
※この情報は2020年9月4日時点のものです。
※間違いや、もっと良い案がありましたらコメントに記載をお願いいたします。
※当ブログに掲載された内容によって生じた損害等の一切の責任を負いません。
私が契約しているレンタルサーバーは“エックスサーバー“です。
タグ:シェル芸